【C++】复制构造函数与类型转换构造函数

复制构造函数

基本概念

复制构造参数只有一个参数,即对同类对象的引用,形如:X::X(X&)X::X(const X&),常用后者。

若用户未定义,则编辑器会生成默认的复制构造函数,完成复制的功能。

class Complex { 
    private: 
        double real,imag; 
}; 

Complex c1; //调用缺省无参构造函数 

Complex c2(c1);//调用缺省的复制构造函数,将 c2 初始化成和c1一样

注:不允许有形如X::X(X)的构造函数。

调用的三种时机

  • 当用一个对象去初始化同类的另一个对象时。
Complex c2(c1);
Complex c2 = c1; //初始化语句,非赋值语句
  • 如果某函数有一个参数是类 A 的对象, 那么该函数被调用时,类A的复制构造函数将被调用。
class A
{
    public:
        A() { };
        A(A & a) {//重写复制构造函数
            cout << "Copy constructor called" <<endl;
        }
};

void Func(A a1){ }

int main(){
    A a2;
    Func(a2);//程序输出:Copy constructor called
    return 0;
}

  • 如果函数的返回值是类A的对象时,则函数返回时, A的复制构造函数被调用。
class A
{
    public:
        int v;
        A(int n) { v = n; };
        A(const A & a) {//重写复制构造函数
            v = a.v;
            cout << "Copy constructor called" <<endl;
        }
};

A Func() {
    A b(4);
    return b;
}

int main() {
    cout << Func().v << endl; 
    return 0;
}

类型转换构造函数

基本概念

只有一个参数,而且不是复制构造函数的构造函数,一般就可以看作是类型转换构造函数。

当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)。

目的

实现类型的自动转换。

class Complex {
    public:
        double real, imag;
        Complex(int i) {//类型转换构造函数
            cout << "IntConstructor called" << endl;
            real = i; imag = 0;
        }
        Complex(double r,double i) {//构造函数
            real = r; 
            imag = i; 
        }
};

int main ()
{
    Complex c1(7,8);
    Complex c2 = 12;
    c1 = 9; // 9被自动转换成一个临时Complex对象
    cout << c1.real << "," << c1.imag << endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章