引用成员变量和const成员变量初始化
- 引用成员变量和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 }