北大 C++ 3.1 复制构造函数

来源:互联网 发布:阿里云 谷歌api 编辑:程序博客网 时间:2024/06/15 17:41

复制构造函数

1.基本概念

1.1. 只有一个参数,即对同类对象的引用。

1.2. 形如 X::X(X&)或 X::X(const X&),二者选一

       后者能以常量对象作为参数,前者不可以。

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

 

class Complex {

       private:

              doublereal,imag;

};

 

Complex c1;

Complex c2(c1);  //c2是c1的一个复制品。

 

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

复制构造函数只能有一个。

#include <iostream>

using namespace std;

 

class Complex {

       public:

              doublereal,imag;

              Complex(){}

              Complex(constComplex & c){

                     real= c.real;

                     imag= c.imag;

                     cout<<"CopyConstructor Called.";

              }

};

 

int main(){

       Complexc1;

       Complexc2(c1);

       return0; 

}

 

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

 

class CSample{

       CSample(CSamplec){…….  }

};

 

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

2.1)当用一个对象去初始化同类的另一个对象时。

Complex c2(c1);

       Complexc2 = c1;    // 初始化语句,非赋值语句,如果没有Complex那么就是赋值语句。

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

 

#include <iostream>

using namespace std;

 

class A{

       public:

              A(){  }

              A(A&a){

                     cout<<"Copyconstructor called."<<endl;

              }

};

 

void Func(A a1){  } //这个地方形参的值不一定等于实参,如果我们自己没有写复制构造函数,那么形参和实参是一样的,是由于编译器自动生成的默认复制构造函数。

int main(){

       Aa2;

Func(a2);

       return0;

}

 

2.3) 如果函数的返回值是类A的对象时,则函数返回时,A的赋值构造函数被 调用。

#include <iostream>

using namespace std;

 

class A{

       public:

              intv;

              A(intn){v=n;}

              A(constA & a){

                     v= a.v;

                     cout<<"Copyconstructor called."<<endl;

              }

};

 

A Func(){

       Ab(4);

       returnb; //以前学过return b肯定和b一样,但是学了复制构造函数以后,这就不一定了。

}

 

int main(){

   class A c(2);

    c= Func();

       cout<<c.v<<endl;

       return0;

}

 

 

这个会不会输出Copy constructor called.要看,因为这涉及到了一个返回值优化的复杂的事情。有可能能本就没有调用自己写的复制构造函数。


2.3. 为什么要自己写复制构造函数?

我们以后再说(会出现有如果不写复制构造函数的话,我们的程序及会出错。)

 

 

 

0 0