复制构造函数

复制构造函数

  • 只有一个参数,即对同类对象的引用。
  • 形如 X::X( X& )或X::X(const X &), 二者选一后者能以常量对象作为参数
  • 如果没有定义复制构造函数,那么编译器生成默认
    复制构造函数。默认的复制构造函数完成复制功能。

如果定义的自己的复制构造函数,则默认的复制构造函数不存在。

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

复制构造函数起作用的三种情况

1 )用一个对象去初始化另一个同类对象
1.Complex c2(c1);
2.Complex c2 = c1; //初始化语句,非赋值语句

2)如果某函数有一个参数是类 A 的对象,
那么该函数被调用时,类A的复制构造函数将被调用。

class A
{
  public:
  A() { };
  A( A & a) {
  cout << "Copy constructor called" <

程序输出结果为: Copy constructor called
Func(a2) ----> A a1 = a2;相当于把a1初始化,调用类A的复制构造函数

3 ) 如果函数的返回值是类A的对象时,则函数返回时,
A的复制构造函数被调用:

class A
{
 public:
 int v;
 A(int n) { v = n; };
 A( const A & a) {
 v = a.v;//①
 cout << "Copy constructor called" <

输出结果:
Copy constructor called
4
是不是没有①v = a.v;这一条语句,Func().v会报错,因为作为返回时,并不是b的实例对象,而是复制构造函数。实际操作时,没有v = a.v,编译器通过但是返回的值根据Func()的不同(Func()和Func2()返回不同)有不同的值
是地址吗?...先留着以后再讨论

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;
}
A Func2(){
    A b(4);
    return b;
}

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

Warn

在实际情况下,我用的CodeBlocks并没有调用复制构造函数,原因查出并写明如下http://www.jianshu.com/p/332f55be02bd

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