C++构造函数调用顺序
2011-10-09 15:26
246 查看
不按顺序的初始化可能引起warning~
http://fafeng.blogbus.com/logs/17747724.html
C++构造函数调用顺序
1. 如果类里面有成员类,成员类的构造函数优先被调用;
2. 创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类);
3. 基类构造函数如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;
4. 成员类对象构造函数如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序;
5. 派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数,否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
运行结果是
对于全局对象(global object),VC下是先定义先初始化,但C++标准没做规定。全局对象默认是静态的,全局静态(static)对象必须在main()函数前已经被构造,告知编译器将变量存储在程序的静态存储区,由C++ 编译器startup代码实现。startup代码是更早于程序进入点(main 或WinMain)执行起来的代码,它能做些像函数库初始化、进程信息设立、I/O stream产生等等动作,以及对static对象的初始化动作(也就是调用其构造函数);在main()函数结束后调用它的析构函数。
http://fafeng.blogbus.com/logs/17747724.html
C++构造函数调用顺序
1. 如果类里面有成员类,成员类的构造函数优先被调用;
2. 创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类);
3. 基类构造函数如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;
4. 成员类对象构造函数如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序;
5. 派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数,否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
#include <iostream> #include <string> class A{ public:A{…} ~A{…} } class B{ public:B{…} ~B{…} } class D{ public:D{…} ~D{…} } class E{ public:E{…} ~E{…} } class C :public A,public B{ public:C{…} private:D objD_; E objE_; ~C{…} } int main(void){ C test; return 0; } |
A{…}//派生表中的顺序 B{…} D{…}//成员类的构造函数优先被调用 E{…} C{…} ~C{…} ~E{…} ~D{…} ~B{…} ~A{…} |
相关文章推荐
- C++中构造函数和析构函数的调用顺序
- [C++] 复杂继承关系中的构造函数调用顺序
- C++中构造函数与析构函数的调用顺序
- C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定
- C++虚基类构造函数详解(调用顺序)之一
- C++ 构造函数和析构函数的调用顺序、虚析构函数的作用
- C++基类、派生类构造函数调用顺序
- C++多继承构造函数调用顺序
- C++ 构造函数和析构函数的调用顺序、虚析构函数的作用
- C++ 类构造函数的调用顺序
- c++ 中构造函数的调用先后顺序
- C++中类的构造函数调用顺序
- C++构造函数调用顺序
- 理解C++存在继承和组合的对象构造函数调用顺序
- C++中构造函数调用顺序
- C++学习笔记(调用构造函数和析构函数的顺序)
- C++ 虚继承对基类构造函数调用顺序的影响
- C++语言基础 例程 调用构造函数和析构函数的顺序
- C++构造函数与析构函数的调用顺序
- C++派生类构造函数和析构函数调用顺序