关于构造函数

构造函数参数问题

如下情况是不允许的

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,采用值传递,在形参和实参相结合的时候,是要调用本类的拷贝构造函数,那么就陷入死循环了,一直调

必须在初始化列表初始化的情况

  1. 需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);
  2. 需要初始化const修饰的类成员或初始化引用成员数据;
  3. 子类初始化父类的私有成员;