有一个类B继承自类A,他们数据成员如下:
class A { ... private: int &a; }; class B : public A { ... private: int a; public: const int b; A c; static const char* d; A* e; };
则构造函数中,成员变量一定要通过初始化列表来初始化的是____。
class A { public: A():a(aa) {} private: int aa; int &a; }; class B : public A { private: int a; public: B():b(2333){} const int b; A c; static const char* d; A* e; };
前面几位已经说得很好了,我亲自试了试,并总结了一下。 在构造函数中需要初始化列表初始化的有如下三种情况 1.带有const修饰的类成员 ,如const int a ; 2.引用成员数据,如 int& p; 3.带有引用的类变量,如: class A { private: int &a; }; class B{ private: A c; } 这里的c需要用初始化列表进行初始化。 class A {
感觉就2种情况,第3条就是根据1.和2.推导的吧
1.非静态 const 成员。
2.引用成员。
3.没有默认构造的类对象(其实就是包含1.和2.的类)。
我不理解,第三种难道不也是推导出来的吗,A::a
是一个引用,因此必须通过在初始化列表中初始化,所以说A需要自己编写构造函数,使用系统默认的构造函数是不可以的。
A一旦编写了构造函数,系统就不会提供默认的构造函数了,所以B类中的c是一个A类子对象,它就没有默认构造了,所以必须在初始化列表显式调用构造函数。