编译器自动生成默认构造函数的情况
来源:互联网 发布:转化率最高的淘客cms 编辑:程序博客网 时间:2024/05/01 02:57
在程序员没有为类定义默认构造函数的情况下,C++编译器在某些情况下会自动生成默认构造函数。
1.类中包含的其他有默认构造函数的类的对象
例如:
Class A
{
private:
int data;
public:
A();
};
A::A()
{
this->data = 10;
}
Class B
{
private:
A m_a;
int m_data;
};
B类中包含A类的成员对象,而A类有默认构造函数,这时,编译器会为B类自动生成一个默认构造函数,用以初始化A类成员变量m_a,生成的代码可能如下:
inline
B::B()
{
m_a.A::A();//调用A类构造函数初始化m_a对象
}
编译器自动生成的默认构造函数只负责初始化有默认构造函数的成员对象,其他的一律不负责(不会去处理m_data的初始化,这个该由程序员去做)
2.基类有默认构造函数
这种情况与上面的类型,编译器生成的默认构造函数可能情况下:
inline
DeviredClass::DeviredClass()
{
this->Base::Base();
}
3.带有虚函数的类
这种情况下是由于编译器需要给每一个该类的对象设置虚函数表的地址,设置每一个对象的vptr(指向vtbl)
因此,编译器需要在类的构造函数中增加这一步操作(这个不是用户来进行的,只要是有虚函数的类编译器都会帮助处理该过程)
其实对于每一个构造函数(无论是编译器自动生成的还是用户定义的),编译器都会在每一个函数中增加设置vptr。
4.虚拟继承的类
这个用的实在比较少,因此略过了。
上面提到的是用户没有提供默认构造函数的情况。
假设用户提供了默认构造函数又会是什么情况
比如用户提供了默认构造函数,但是函数中没有去调用基类构造函数初始化对象基类部分亦或没有去调用成员对象的默认构造函数
那么,编译器会在编译时在用户提供的构造函数中帮助用户增加这些代码,无论是默认构造函数还是其他用户自定义构造函数
总结自《INSIDE THE C++ MODEL》
- 编译器自动生成默认构造函数的情况
- C++ 编译器生成默认构造函数的四种情况
- C++ 编译器生成默认构造函数的四种情况
- C++ 编译器生成默认构造函数的四种情况
- C++系统自动生成默认构造函数的情况
- 关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数)
- c++ 编译器为class自动合成默认构造函数的四种情况
- 什么情况下C++编译器会生成默认的构造函数
- 什么情况下C++编译器会生成默认的构造函数
- C++编译器为类自动生成拷贝构造函数的情况
- C++编译器提供默认构造函数的几种情况
- 编译器提供默认构造函数的几种情况
- c++编译器什么时候生成默认构造函数
- C++会生成默认构造函数的四种情况
- C++中默认构造函数的生成(哪些情况会产生默认构造函数)
- C++构造函数和编译器自动生成代码的陷阱
- 编译器默认生成的函数
- 什么情况下c++编译器会合成默认构造函数
- Tomcat6配置日志
- PAT 05-1 List Components (简单DFS与BFS)
- LeetCode 153. Find Minimum in Rotated Sorted Array
- UVA - 11292 Dragon of Loowater (贪心)
- Tomcat架构(四)
- 编译器自动生成默认构造函数的情况
- 《C语言及程序设计》实践项目——利用switch语句解决问题
- 《C语言及程序设计》实践项目——if语句的嵌套
- 《C语言及程序设计》实践项目——用if语句实现分支结构
- 《C语言及程序设计》实践项目——画分支结构流程图
- 更有效的编写QQ空间、CSDN、博客园图文并茂的文章
- 瀑布流-jquery代码
- 【HDU1281】棋盘游戏
- 一步一步学习 JQuery (四) 过滤选择器:属性过滤选择器 && 子元素过滤选择器 && 表单过滤选择器