三、C++ 复制构造函数

C++ 复制构造函数

一、基本概念

只有一个参数,且为对同类对象的引用。

格式:X::X( X& )或X::X(const X &),后者能以常量对象作为参数。

如果没有定义复制构造函数,那么编译器生成默认复制构造函数。默认的复制构造函数完成复制功能。

例子:

class Complex {
public :
    Complex(){ }
    Complex( const Complex & c ) {
        cout << “Copy Constructor called”;
    }
};
Complex c1;
Complex c2(c1);//调用自己定义的复制构造函数

输出

Copy Constructor called

二、复制构造函数的三个使用场合

2.1 一个对象去初始化同类的另一个对象时

以下两种情况,复制构造函数都会被调用

Complex c2(c1); 
Complex c2 = c1; //初始化语句,非赋值语句

2.2 作为函数的形参

class A { 
 public:
        A() { }
        A( A & a) {
            cout << "Copy constructor called" <<endl;
        }
};
void Func(A a1){ }
int main(){
    A a2;
    Func(a2);

    return 0;
}

程序输出结果为

Copy constructor called

当类的对象作为某个方法的形参,且这个方法被调用时,该类的复制构造函数将被调用,并用于初始化这个方法中的形参。

在这个例子里面,a1是复制构造函数初始化的,初始化的时候,它所调用的复制构造函数的参数是a2。a1不一定等于a2,因为a1的值是复制构造函数初始化的,而这个复制构造函数并没有做复制的工作。

2.3 作为函数的返回值

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;
}

输出结果:

Copy constructor called
4

三、小结

复制构造函数:

A( A & a) { }
//或:
A(const A & a) { }
  1. 复制构造函数无返回值,只有一个参数,且为同类对象的引用,作用是复制一个类的对象给该类的另一个对象

  2. 复制构造函数被调用的情况有三种,分别是用一个对象去初始化另一个对象的时候、一个对象作为某个函数的形参且这个函数被调用的时候、一个对象作为某个函数的返回值且这个函数被调用的时候

你可能感兴趣的:(C++,复制构造函数)