deep_c++:构造函数——1
来源:互联网 发布:2016nba数据库排名 编辑:程序博客网 时间:2024/05/26 15:56
一般情况下,编译器生成的默认构造函数时不干事的,但是在一下的四种情况,默认的构造函数是要干事的:
1)包含有带构造函数的类成员的类
class A
{
public:
A(int x) : i(x) {};
private:
int i;
};
class B
{
private:
char i;
A a;
};
这种情况下B的默认的构造函数是要干活的。
2)继承自带有构造函数的基类的类
class A
{
public:
A(int x) : i(x) {};
private:
int i;
};
class B : public A
{
private:
int b;
};
3)带有虚函数的类
因为有vptr所以需要初始化
4)带有一个虚基类的类
总结:简单来讲编译器会为构造函数做的一点事就是调用其基类或成员对象的默 认构造函数,以及初始化vprt以及准备虚基类的位置。
总的来说,编译器将对构造函数动这些手脚:
- 如果类虚继承自基类,编译器将在所有构造函数中插入准备虚基类位置的代 码和提供支持虚基类机制的代码。
- 如果类声明有虚函数,那么编译器将为之生成虚函数表以存储虚函数地址, 并将虚函数指针(vptr)的初始化代码插入到类的所有构造函数中。
- 如果类的父类有默认构造函数,编译将会对所有的默认构造函数插入调用其 父类必要的默认构造函数。必要是指设计者没有显示初始化其父类,调用顺 序,依照其继承时声明顺序。
- 如果类包含带有默认构造函数的对象成员,那么编译器将会为所有的构造函 数插入对这些对象成员的默认构造函数进行必要的调用代码,所谓必要是指 类设计者设计的构造函数没有对对象成员进行显式初始化。成员对象默认构 造函数的调用顺序,依照其声明顺序。
- 若类没有定义任何构造函数,编译器会为其合成默认构造函数,再执行上述 四点。
【2011/12/21 补】需要说明的是,从概念来上来讲,每一个没有定义构造函数 的类都会由编译器来合成一个默认构造函数,以使得可以定义一个该类的对象, 但是默认构造函数是否真的会被合成,将视是否有需要而定。C++ standard 将 合成的默认构造函数分为 trivial 和 notrivial 两种,前文所述的四种情况对 应于notrivial默认构造函数,其它情况都属于trivial。对于一个trivial默认 构造函数,编译器的态度是,既然它全无用处,干脆就不合成它。在这儿要厘清 的是概念与实现的差别,概念上追求缜密完善,在实现上则追求效率,可以不要 的东西就不要。
0 0
- deep_c++:构造函数——1
- deep_c++:拷贝构造函数
- deep_c++::多态,虚函数的一点理解
- java—构造函数
- 第四周项目1—三角形类的构造函数(2)设计默认构造函数
- C++构造函数语义——默认构造函数
- C++构造函数语义——默认构造函数
- C++构造函数语义——默认构造函数
- C++构造函数语义——默认构造函数
- C++构造函数语意学——默认构造函数
- 【C++】基础知识—构造函数与拷贝构造函数
- 学习心得——构造函数
- C++——构造函数
- JAVA——构造函数
- 【基础知识】——构造函数
- C#——构造函数
- JAVA——构造函数
- C++——构造函数
- Qt初级:基于拖放操作和文件流操作的文件转换小助手
- java多线程中的异常处理 - 异常处理在多线程中的原则
- Cocos3.0数据结构Value Map Vector
- CATransition
- spark应用程序的运行架构
- deep_c++:构造函数——1
- Linux中crontab的坑爹环境变量问题
- Js生成(柱形/饼图)图表
- Launcher Activity在开机时重启两次解决办法
- DELPHI 把数据库中的数据转换成XML格式
- monkey log分析说明
- 推荐网站博客
- Aspose.word保存PDF时进行授权访问设置
- combobox联动