构造函数参数问题
如下情况是不允许的
class complex {
public:
complex (double r = 0, double i = 0) : re(r), im (i) { }
complex () : re(r), im (i) { }
private:
double re, img;
};
{
complex c1;
complex c2 ();
}
因为第一个构造函数已经指定了默认的值,所以调用构造函数没有给参数时,编译器不知道应该调用第一个还是第二个。
扩充一下:
假如有n个成员变量,一个构造函数有个n个参数,有一个设了默认值(=x),还有一个有n-1个参数(无论有没有给初值),现在定义一个类对象,参数给了n-1个,那么是无法通过的,因为不知道该调用第一个还是第二个构造函数
class A {
public:
A (int a1, int a2, int a3, ..... , int an-2, int an-1, int an = 0) : ........ { }
A (int a1, int a2, int a3, ..... , int an-2, int an-1) : ........ { }
private:
int a1,a2,a3.......,an;
}
int main()
{
A a(a1,a2,a3.......,an-1);//不行
}
构造函数位置问题
一般都放在public里,但是也有放在private里,比如单例模式
class A {
public:
static A& getInstance ();
setup () { ...}
private:
A ();
A (const A& rhs);
...
};
A& A::getInstance()
{
static A a;
return a;
}
拷贝构造函数的参数为什么不能是值传递,必须是引用传递
如果把拷贝构造函数的参数设置为值传递,那么参数肯定就是本类的一个object,采用值传递,在形参和实参相结合的时候,是要调用本类的拷贝构造函数,那么就陷入死循环了,一直调
必须在初始化列表初始化的情况
- 需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);
- 需要初始化const修饰的类成员或初始化引用成员数据;
- 子类初始化父类的私有成员;