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类的指针和引用。

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

相关推荐
缺点内向3 小时前
C#: 高效移动与删除Excel工作表
开发语言·c#·.net·excel
老前端的功夫4 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
ᐇ9595 小时前
Java HashMap深度解析:数据结构、原理与实战指南
java·开发语言·数据结构
QT 小鲜肉5 小时前
【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)
linux·开发语言·笔记·单片机·压力测试
程序员龙一5 小时前
C++之static_cast关键字
开发语言·c++·static_cast
yue0085 小时前
C# 分部类读取学生信息
开发语言·c#
奶茶树5 小时前
【C++/STL】map和multimap的使用
开发语言·c++·stl
聪明努力的积极向上6 小时前
【C#】事件简单解析
开发语言·c#
懒羊羊不懒@6 小时前
JavaSe—集合框架、Collection集合
java·开发语言