有一个类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;
};
则构造函数中,成员变量一定要通过初始化列表来初始化的是____。
&Builder
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类子对象,它就没有默认构造了,所以必须在初始化列表显式调用构造函数。