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

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

相关推荐
会周易的程序员2 分钟前
5Draft使用说明书
服务器·c++·分布式·raft·共识
weixin1997010801611 分钟前
[特殊字符]《闲鱼 + 淘宝 + 1688 三平台库存同源:二手ERP主数据治理与超卖防御》(附Python源码)
开发语言·python
ltqshs16 分钟前
C语言-链表例程
c语言·开发语言·链表
码匠许师傅16 分钟前
【设计模式精讲】21.迭代器模式(Iterator)
c++·设计模式·rpc·迭代器模式·软件工程·uml
shmily麻瓜小菜鸡21 分钟前
JavaScript / TypeScript 易踩坑知识点 —— 作用域与变量类
开发语言·javascript·typescript
YYYing.23 分钟前
【C++进阶系列 (一)】关于线程堆栈的那些事 (上篇)
c语言·开发语言·c++·线程堆栈
zh731425 分钟前
Go 1.23 → 1.26 升级检查文档
开发语言·chrome·golang
CRMEB系统商城26 分钟前
汽车养护连锁的数字化底座CRMEB 多门店系统实战方案
java·开发语言·小程序·开源·汽车
努力努力再努力wz33 分钟前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
知兀1 小时前
Tailwindcss报错:没有与此调用匹配的重载
前端·c++·tailwindcss