调用拷贝构造函数的三种情况

来源:互联网 发布:裁床捆条算法公式 编辑:程序博客网 时间:2024/06/05 04:30

1   当用类的一个对象去初始化类的另一个对象时。

    如下代码中的  Rectangle  p2(p1),  //用对象p1去初始化对象p2,拷贝构造函数被调用(代入法)

   还有一种是赋值法  Rectangle   p2=p1;


2  当函数的形参是类的对象,调用函数进行形参和实参的结合时。例如

void fun1(Rectangle p)//形参是类Rectangle的对象p

{

    p.disp();

}

int main()

{

   Rectangle p1(10,20);

   fun1(p1);//调用函数fun1时,实参p1是类Rectangle的对象,将调用拷贝构造函数时,初始化形参对象p;

   return 0;

}

   在main()函数内,执行语句“fun(p1)”,便是这种情况,在调用这个函数时,对象p1是实参,用它来初始化被调用函数的形参p时,需要调用拷贝构造函数;


3  当函数的返回值是对象,函数执行完成返回调用者时,例如:

Rectangle fun2()

{

   Rectangle p1(10,30);

   return p1;  //函数的返回值是对象

}

int main()

{

   Rectangle p2;

  p2=fun2();  //函数执行完成,返回调用者时,调用拷贝函数;

  return 0;

}

在函数fun2()内,  执行语句“return p1”,将会调用拷贝构造函数将p1的值复制到一个无名对象中,这个无名对象是编译器系统在主程序中临时创建的。

函数运行结束时对象p1消失,但临时对象会存在于语句“p2=fun2()”中。执行完这条语句,临时无名对象的使命也就完成了,该临时对象便自动消失了;

   //如果你的编译器对于第三种情况与该例不符合,请阅读我的文章

C++返回值为对象时复制构造函数不执行怎么办?

代码样例如下:

#include<iostream>
using namespace std;
class Rectangle
{
public:
    Rectangle(int len=10,int wid=10);
    Rectangle(const Rectangle &p);
    void disp()
    {
        cout<<length<<"  "<<width<<endl;
    }
private:
    int length;
    int width;
};


Rectangle::Rectangle(int len,int wid)
{
    length=len;
    width=wid;
    cout<<"using normal constructing..."<<endl;
}
Rectangle::Rectangle(const Rectangle &p)
{
    length=2*p.length;
    width=2*p.width;
    cout<<"using copy constructing..."<<endl;
}
void fun1(Rectangle p)
{
    p.disp();
}
Rectangle fun2()
{
    Rectangle p4(10,30);
    return p4;
}
int main()
{
    Rectangle p1(30,40);
    p1.disp();
    Rectangle p2(p1);
    p2.disp();
    Rectangle p3=p1;
    p3.disp();
    fun1(p1);
    p2=fun2();
    p2.disp();
    return 0;
}



0 0