对象的构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。
析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。
一个有趣的现象是,成员对象初始化的次序完全不受它们在初始化表中次序的影响, 只由成员对象在类中声明的次序决定。
这是因为类的声明是唯一的,而类的构造函数可以有多个,因此会有多个不同次序的初始化表。
如果成员对象按照初始化表的次序进行构造,这将导致析构函数无法得到唯一的逆序。”
和类型在一起的是引用,和变量在一起的是取址。
int a=3; int &b=a; //引用
int *p=&a; //取地址
1)引用保存的就是地址
2)引用参数,可以实现地址传递,这就是C++引用传递的实质。
所以 引用 共用了& int a; int &ref = a;// 编译后的代码实质是,int * const ref_const =&a; ref 的地址是a 的地址。
指针和引用中的*和&都是一个修饰。如果没有前面的类型(int、float...)&就是一个单纯的取地址,*只是dereference。有了前面的类型,才会是一个完整的定义。
引用的一些规则如下:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧引用s1, // 但是 s1的值现在是 // "Clancy"
ps = &s2; // ps 现在指向 s2; // s1 没有改变
http://m.blog.csdn.net/article/details?id=5617155&winzoom=1