当前位置: 首页 > news >正文

小学生学C++编程语法知识(什么情况下会自动生成默认构造函数)


对于小学生,可以先记住一句话:

如果我们没有写任何构造函数,C++ 编译器可能会偷偷帮我们生成一个默认构造函数;但是一旦我们自己写了某些构造函数,编译器通常就不再自动生成。

下面详细讲解。


一、什么是默认构造函数?

先看一个类:

class Student { };

我们没有写任何东西。


但是:

Student s;

为什么可以创建对象?


因为编译器偷偷帮我们生成了:

class Student { public: Student() { } };

这个没有参数的构造函数:

叫:

默认构造函数(default constructor)


二、什么时候会自动生成默认构造函数?

主要有以下情况。


情况1:类里面完全没有构造函数

这是最常见情况。

例如:

class Student { public: int age; };

我们没有写:

Student() { }

那么编译器会自动生成:

Student() { }

所以:

Student s;

可以。


但是注意:

自动生成的默认构造函数:

不会自动给普通变量初始化。

例如:

class Student { public: int age; }; int main() { Student s; cout << s.age; }

这里:

s.age

里面是什么?

不确定!


因为:

int age;

没有初始化。

可能:

123456

也可能:

0

也可能:

垃圾值

情况2:类有成员对象,但自己没有构造函数

例如:

class Book { }; class Student { public: Book b; };

Student没有构造函数。

编译器生成:

Student() { }

但是创建 Student:

Student s;

时:

必须先创建:

Book b;

所以调用:

Book()

如果 Book 有默认构造函数:

没问题。


三、什么时候不会自动生成默认构造函数?

这是考试重点。


情况1:自己写了带参数构造函数

例如:

class Student { public: Student(int x) { } };

现在:

我们自己写了构造函数。

那么:

编译器认为:

“你已经设计好了,我不帮你了。”


所以:

不会生成:

Student() { }

因此:

Student s;

错误。

因为:

没有:

Student()

但是:

这样可以:

Student s(10);

因为:

匹配:

Student(int)

情况2:自己写了拷贝构造函数

例如:

class Student { public: Student(const Student& s) { } };

我们自己写了:

拷贝构造函数。

编译器:

不会生成默认构造函数。

所以:

Student a;

错误。

但是:

Student b(a);

可以。


四、课堂练习题:

看:

class A { }; class B { public: B(int x) { } };

问:

下面哪些可以自动生成默认构造函数?


1.

A a;

可以。

为什么?

因为:

A没有任何构造函数。

自动生成:

A()

2.

B b;

错误。

因为:

B自己写了:

B(int)

所以:

没有:

B()

3.

B b(5);

可以。

因为:

调用:

B(int)

五、为什么 C++ 这样设计?

同学们可以理解成:

编译器像一个助手:

如果你说:

“我什么都没安排。”

编译器:

“好,我帮你安排一个最简单的。”


但是如果你说:

“我要学生必须输入年龄才能创建。”

例如:

Student(int age) { }

编译器:

“你已经制定规则了,我不能偷偷增加一个空创建。”

否则:

Student s;

会绕过你的设计。


六、特殊成员函数总结表

C++ 一个类默认有6个特殊函数:

函数作用什么时候自动生成
默认构造函数创建空对象没有任何构造函数时
析构函数释放资源通常自动生成
拷贝构造函数复制对象没有自己写时
拷贝赋值运算符对象赋值没有自己写时
移动构造函数移动对象满足条件时
移动赋值运算符移动赋值满足条件时

七、小学生记忆口诀

没有构造, 编译器造。 自己写了, 编译器跑。 想要空对象: class A { }; 可以。 写了: A(int x) 以后: A a; 不可以。

八、和前面“对象创建过程”联系

创建:

Student s;

过程:

第一步:

找到:

Student()

第二步:

执行构造函数。

如果:

没有写构造函数:

编译器帮你生成。

如果:

你写了:

Student(int)

那么:

默认构造函数不存在。


所以:

“自动生成默认构造函数”的核心判断方法:

看类里面有没有用户自己写的构造函数。

这也是 GESP/CSP C++ 面向对象部分非常喜欢考的知识点。


http://www.jsqmd.com/news/1359283/

相关文章:

  • 2026年广佛办公家具回收服务商**:实体仓储、透明报价与全流程托管 - 品牌品鉴馆
  • 2026年8月上海奉贤区离婚律所哪家专业?6家新城家事法律服务团队解析 - 品牌深度评测
  • PlayCover终极指南:如何在M1/M2 Mac上免费运行iOS应用和游戏
  • 2026铝塑共挤窗服务厂商口碑推荐强势出炉,实力测评不踩坑 - myqiye
  • SunnyUI:用100+控件库彻底改变你的C WinForm开发体验
  • 基于用户行为数据的风格偏好建模与个性化推荐系统实战
  • 模块化本地AI集成:ChatBox与Ollama的3种连接策略深度解析
  • 灯哥开源FOC控制器:如何快速上手双路无刷电机驱动方案
  • BearJia Admin V3.0:微前端与RBAC权限系统重构实战
  • 专业验光+透明定价1.7折:潘家园眼镜去哪里配比较便宜不踩坑?答案在这里 - 甄选测评馆
  • HTML Button参数详解与前端开发实践指南
  • 2026年物流比价平台哪个最便宜?看完这篇别再踩坑了 - 快递物流资讯
  • 3分钟快速上手roop-unleashed:零基础AI换脸完整指南
  • 精品店如何利用QClaw+Skills做GEO运营:ima知识库搭建×内容创作×自媒体平台分发策略
  • 阿里云Qwen-Image-3.0:高性价比云端多模态视觉API实践指南
  • 如何免费绕过iOS 15-16激活锁:5步使用Applera1n的实用指南
  • C#游戏开发实战:从零构建游戏引擎与核心机制
  • 前端性能优化:滑动组件卡顿分析与防抖节流实战
  • 外贸成交81 | 一个客户的真正价值,从第二单才开始 - 外贸圈集团
  • 2026值得推荐的晶圆探针台供应商十大实力品牌,避坑攻略不踩雷 - myqiye
  • 在线图片转word工具盘点:免费OCR文字识别与水印处理方案怎么选 - 免费软件工具方法教程
  • 2026年8月上海崇明区离婚律所哪家好?4家海岛家事纠纷处理律所盘点 - 品牌深度评测
  • Display Driver Uninstaller终极指南:彻底解决显卡驱动问题的完整方案
  • STP与VLAN技术解析:构建可靠二层网络的核心
  • 2026年北京金刚网纱窗更换 诚信合规服务商参考指南 - 品牌品鉴馆
  • AppleRa1n终极指南:iOS 15-16激活锁绕过完整教程(免费开源方案)
  • 如何开发AutoJs6插件:从入门到精通的完整指南
  • HTML作业实践指南:从基础搭建到进阶技巧
  • 2026年装修公司线上获客指南:核心渠道、执行步骤与服务商推荐 - U渠道
  • 侧向平移防火卷帘,联动温控装置,满足消防验收标准