c++前置前置声明(函数与类)

c++是以c的为基础进行后来改进的,而学过c语言的都知道,在c语言中,有时我们不可避免的要用声明,因为有时候我们在定义函数的时候,函数的定义写在了.cpp或是.c文件,而函数的声明我们一般放到了头文件中。一般也都说是定义最好不要写到头文件中,这样可能会导致头文件空间变大(只是建议不要放在头文件中,不是不可以)。而在C++中,因为其实面向对象编程的语言,所以不我们有时会在头文件中定义类,而此时可能会出现已一种报错,就是使用了不完整的类型。而出现这种错误的本质是使用了前置声明。

声明是什么意思,就不多说了,很简单,也很好理解,但是声明也是有大坑的。我们先看看下面的代码。

cpp 复制代码
#include <iostream>
using namespace std;
class A;
void fun()
{
	A s;
}
class A
{
public:
	int a = 0;
};
int main()
{
	fun();
	return 0;
}

这段代码编译的时候会报错吗?无疑是会报错的。为什么呢?很简单的一个原因,就是虽然我们使用了前置声明来告诉编译器存在A这个类,但是编译器此时并不知道的是A这个类的大小是多少,具体有哪些成员函数或者成员变量,所以我们在fun这个函数中使用A类实例化对象的时候,无法使用。若是此时你把类的包装到了头文件,而在类一个头文件中使用这个包装的类的时候,就会出现使用不完整的类的报错。这里虽然不可以使用A类实例化对象,但是可以定义A类的指针和引用。

那有些朋友可能就疑惑了,类在声明之后,定义之前不可以使用其成员变量或者是成员函数,为什么函数声明的时候,在定义之前,声明之后,这之间就可以使用呢?函数调用其实是在链接阶段来进行。也就是你只要实现了函数的定义,那么在链接阶段就会去找,如果有,那么就会运行,如果没有,那么就会报错,出现链接错误。

相关推荐
牛奔17 分钟前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
geovindu1 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
学逆向的1 小时前
汇编——JCC指令
开发语言·汇编·网络安全
mayaairi2 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
kite01212 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
hold?fish:palm4 小时前
kv存储主从复制的设计与实现
c++·redis·后端
l156469484 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
啦啦啦啦啦zzzz4 小时前
算法:贪心算法
c++·算法·leetcode·贪心算法
charlie1145141914 小时前
现代C++工程实践 WeakPtr 实战(三):WeakPtrFactory 与「最后成员」惯用法
开发语言·c++·开源项目·现代c++
IT小盘6 小时前
04-大模型流式输出原理-SSE与Python实现
开发语言·网络·人工智能·python