- 引用成员变量和const成员变量初始化只能通过成员初始化列表初始化。引用成员变量地址会变为对应初始化变量的地址。
- 引用成员变量和const成员变量在class中定义未声明时,和普通成员变量是一样的,对象通过成员初始化列表后,或者进入构造函数内部代码块那一刻,才会赋予引用和const的职能
- 普通成员变量(非引用)和const成员变量通过成员初始化列表会调用对应类的拷贝构造函数。
1 class B
2 {
3 public:
4 B(int& a ):b(a)
5 {
6 cout << "B的构造函数" << endl;
7 }
8
9 B(B& a) :b(a.b)
10 {
11 cout << "B的拷贝构造函数"<<endl;
12 }
13
14 private:
15 int& b;
16 };
17
18 class NameObject
19 {
20 public:
21 NameObject(string& str, B& btemp1, B& btemp2) :
22 nameValue(str),
23 bob(btemp1), // 调用B的拷贝构造函数
24 baba(btemp2) // 调用B的拷贝构造函数
25 {
26 printf("变量str地址 :%p\n", &str);
27 printf("变量nameValue地址:%p\n", &nameValue);
28 printf("变量btemp1地址 :%p\n", &btemp1);
29 printf("变量bob地址 :%p\n", &bob);
30 printf("变量btemp2地址 :%p\n", &btemp2);
31 printf("变量baba地址 :%p\n", &baba);
32 cout << "NameObject的构造函数" << endl;
33 }
34
35 public:
36 string& nameValue;
37 const B bob;
38 B baba;
39 };
40
41
42
43 int main()
44 {
45 string str{ "str" };
46 printf("str地址 :%p\n", &str);
47 int a1 = 3, a2 = 4;
48 B b1{ a1};
49 B b2{ a2 };
50 printf("b1地址 :%p\n", &b1);
51 printf("b2地址 :%p\n", &b2);
52 NameObject n1{ str, b1, b2};
53 return 0;
54 }
