C++ 什么时候生成默认构造函数

简介: C++ 什么时候生成默认构造函数

一、空的类定义,不会生成,没有意义

即便是包含成员变量,成员变量是基础类型,还是不会生成默认构造函数,编译器也不知道用什么值初始化

二、什么情况下会生成默认构造函数

1. 类A内数据成员是对象B,而类B提供了默认构造函数

为了让B的构造函数被调用到,不得不为A生成默认构造函数

2. 类的基类提供了默认构造函数

子类构造函数要先初始化父类,再初始化自身成员变量

如果父类没有提供默认的构造函数,子类也无需提供默认构造函数

如果父类提供了默认的构造函数,子类不得不生成默认构造函数

3. 类内定义了虚函数

为了实现多态机制,需要为类维护一个虚函数表

类所有对象需要保存一个指向该虚函数表的指针

对象需要初始化虚函数列表的指针

不得不提供默认构造函数来初始化虚函数列表的指针

4. 类使用了虚继承

虚基类表记录了类继承的所有的虚基类子对象在本类定义对象内的偏移位置

为了实现虚继承,对象在初始化阶段需要维护一个指向虚基类表的指针

不得不提供默认构造函数来初始化虚基类表指针


推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:

零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)

https://xxetb.xet.tech/s/VsFMs


相关文章
|
1月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
69 30
|
17天前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
15 1
|
17天前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
13 0
|
17天前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
17 0
|
2月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
33 1
|
4月前
|
安全 编译器 C++
C++一分钟之-构造函数与析构函数
【6月更文挑战第20天】C++中的构造函数初始化对象,析构函数负责资源清理。构造函数有默认、参数化和拷贝形式,需注意异常安全和成员初始化。析构确保资源释放,避免内存泄漏,要防止重复析构。示例代码展示了不同构造函数和析构函数的调用情况。掌握构造和析构是有效管理对象生命周期和资源的关键。
43 2
|
5月前
|
C++ Linux
|
3月前
|
编译器 C++
【C++】详解构造函数
【C++】详解构造函数
|
4月前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。
|
4月前
|
存储 编译器 C语言
【C++】类和对象②(类的默认成员函数:构造函数 | 析构函数)
C++类的六大默认成员函数包括构造函数、析构函数、拷贝构造、赋值运算符、取地址重载及const取址。构造函数用于对象初始化,无返回值,名称与类名相同,可重载。若未定义,编译器提供默认无参构造。析构函数负责对象销毁,名字前加`~`,无参数无返回,自动调用以释放资源。一个类只有一个析构函数。两者确保对象生命周期中正确初始化和清理。