Effective item 12
new 分配空间->初始化->构造函数
malloc 分配空间
对象的创建分两步:
1. 数据成员初始化。(参见条款13)
2. 执行被调用构造函数体内的动作。
由于a中的s未被初始化,也就是没有调用string的默认构造函数
导致s->s = "abc"异常
使用AA *a = new AA;正常运行
显示:
BB constructor // 对AA类中成员的初始化过程
AA constructor // 对AA构造函数的调用
AA destructor // 对AA析构函数的调用
BB destructor
使用malloc无任何显示
初始化列表与构造函数:
初始化列表 是复制构造函数的过程 即Intialization (const 和引用数据 只能初始化 不可以赋值) (使用初始化列表的对象 默认初始化过程不再进行)
构造函数 是赋值过程 即assignment (赋值前 已经有了一个默认初始化过程[调用他的默认构造函数] 然后在赋值操作 效率比直接利用初始化列表低)
在构造函数内对成员变量赋初值:
显示:
BB constructor // main 中b的构造
CC constructor // main 中c的构造
BB constructor // 类AA对BB的默认初始化 通过BB的默认构造函数
CC constructor // 类AA对CC的默认初始化 通过CC的默认构造函数
BB assignment // 类AA构造函数中的赋值
CC assignment // 类AA构造函数中的赋值
CC destructor
BB destructor
在初始化列表中初始化
显示:
BB constructor // main 中b的构造
CC constructor // main 中c的构造
BB copy constructor // 类AA对BB的初始化列表中的初始化 通过BB的复制构造函数 【省去了上例的默认初始化过程】
CC copy constructor // 类AA对CC的初始化列表中的初始化 通过CC的复制构造函数 【省去了上例的默认初始化过程】
CC destructor
BB destructor