【深入理解C++】默认构造函数

一个广为流传的、很多教程/书籍都推崇的错误结论:默认情况下,编译器会为每一个类生成空的无参的构造函数。

在下面代码中,编译器并没有生成一个空的无参的构造函数,而是直接给成员变量赋值。

#include <iostream>

using namespace std;

class Person
{
public:
	int m_age;
};

int main()
{
	Person person;
	person.m_age = 10;

	return 0;
}

在这里插入图片描述

正确理解:在某些特定的情况下,编译器才会给类自动生成空的无参的构造函数。

(1) 成员变量在声明的同时进行了初始化。

#include <iostream>
using namespace std;

class Person
{
public:
	int m_age = 0;
};

int main()
{
	Person person;
	person.m_age = 10;

	return 0;
}

在这里插入图片描述

在这里插入图片描述

(2) 有定义虚函数。

#include <iostream>
using namespace std;

class Person
{
public:
	int m_age;
	virtual void run()
	{

	}
};

int main()
{
	Person person;

	return 0;
}

(3) 虚继承了其他类。

#include <iostream>
using namespace std;

class Person
{
public:
	int m_age;
	void run()
	{

	}
};

class Student : virtual public Person
{
public:
	int m_score;
};

int main()
{
	Student student;

	return 0;
}

(4) 包含了对象类型的成员且这个成员有构造函数(编译器生成或自定义)。

#include <iostream>
using namespace std;

class Car
{
public:
	int m_price;
	Car() {}
};

class Person
{
public:
	Car car;
};

int main()
{
	Person person;

	return 0;
}

(5) 父类有构造函数(编译器生成或自定义)。

#include <iostream>
using namespace std;

class Person
{
public:
	int m_age;
	Person() {}
};

class Student : public Person
{
public:
	int m_score;
};

int main()
{
	Student student;

	return 0;
}

总结:对象创建后,需要做一些额外操作时,比如内存操作、函数调用等,编译器一般都会为其自动生成无参的构造函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bruce Eckel 《Thinking in Java》(Java编程思想)作者。Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有表决权的成员之一,曾经写过另五本面向对象编程书籍,发表过150篇以上的文章,是多本计算机杂志的专栏作家。Eckel开创Software Development Conference的C++、Java、Python等多项研讨活动。拥有应用物理学学士和计算机工程学硕士学位。 目录 译者序 前言 第1章 对象导言 第2章 对象的创建与使用 第3章 C++中的C 第4章 数据抽象 第5章 隐藏实现 第6章 初始化与清除 第7章 函数重载与默认参数 第8章 常量 第9章 内联函数 第10章 名字控制 第11章 引用和拷贝构造函数 第12章 运算符重载 第13章 动态对象创建 第14章 继承和组合 第15章 多态性和虚函数 第16章 模板介绍 附录A 编码风格 附录B 编程准则 附录C 推荐读物 索引 第2卷:实用编程技术 出版者的话 专家指导委员会 译者序 前言 第一部分 建立稳定的系统 第1章 异常处理 第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发 附录 附录A 推荐读物 附录B 其他 索引 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值