美文网首页
C++ - 复制构造函数

C++ - 复制构造函数

作者: Mitchell | 来源:发表于2016-01-14 16:12 被阅读83次

    概念

    • 只有一个参数,即对同类对象的引用。
    • 形入 X::X(X&)或者 X::X(const X &),二者选一,后者能以常量对象作为参数。
    • 如果没有定义赋值构造函数,那么编译器生成默认赋值构造函数。默认的复制构造函数完成复制功能。
    class A{
          private :
                      double real,image;
    };
    A c1;    //调用缺省无参构造函数
    A c2(c1);//调用缺省的赋值构造函数,将 c2初始化成和 c1一样
    
    • 如果定义的自己的复制构造函数,则默认的复制构造函数不存在。
    class Complex{
        public:    
                  double real,image;
        Complex(){}
        Complex(const Comples &c){
                real = c.real;
                imag = c.imag;
                cout<<"Copy Constructor called";
        }
    };
    //调用
    Complex c1;
    Complex c2(c1);
    
    • 不允许有形如 X::X(X)的构造函数。参数一定是本类的引用,不能是本类的对象。
    class CSample{
          CSample(CSample c){
          }//错,不允许这样的构造函数
    }
    
    • 复制构造函数起作用的三种情况
      • 1)当一个对象去初始化同类的另一个对象的时候。
    Complex c2(c1);
    Complex c2 = c1;//初始化语句,非复制语句
    c2 = c1;//赋值语句
    
    - 2)如果某函数有一个参数是类 A 的对象,那么该函数被调用时,类 A 的复制构造函数将被调用。
    
    class A
    {
            public:
            A() {};
            A(A & a){
              cout<<"Copy constructor called"<<endl;
            }
    };
    void Func(A a1){}
    int main(){
      A a2;
      Func(a2);
      return 0;
    }
    
    - 3) 如果函数的返回值是类 A 的对象时,则函数返回时,A 的赋值构造函数被调用:
    
    A Func(){
        A b(4);
        return b;
    }
    int main(){
        cout<<Func().v<<endl;
        return 0;
    }
    
    • 为什么要自己写赋值构造函数?
    //参数:参数的传递会默认调用复制构造函数
    void func(A a){cout <<"good"<<endl;}
    //返回值:会默认调用复制函数
    A func(){A tmp;return tmp;}
    
    

    相关文章

      网友评论

          本文标题:C++ - 复制构造函数

          本文链接:https://www.haomeiwen.com/subject/ddfhkttx.html