调用拷贝构造函数的情形
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以
值传递的方式传入
函数体;
2) 一个对象作为函数返回值,以
值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行
初始化(常称为
赋值初始化);
#include<iostream>
using namespace std;
class Position
{
private:
int x;
int y;
public:
Position(){}
Position(int x, int y) :x(x), y(y)
{
cout << "Position(int x, int y), x = " << x << ", y = "<< y << endl;
}
~Position()
{
cout << "~Position(), x = " << x << ", y = " << y << endl;
}
Position(const Position&p)
{
cout << "Position(const Position&p)" << endl;
this->x = p.x;
this->y = p.y;
}
Position & operator=(const Position&p)
{
cout << "Position & operator=(const Position&p)" << endl;
this->x = p.x;
this->y = p.y;
return *this;
}
};
Position testCopyFunction()
{
Position p(1, 2);//调用构造函数
return p;//返回调用拷贝构造函数把局部对象p复制给一个内存中分配的临时的匿名对象上作为函数的返回值
//函数结束后释放p的内存,调用析构函数
//场景4
}
int main(int argc, char* argv[])
{
Position p;
p = testCopyFunction();//调用拷贝构造操作符完成复制
//完成赋值后,临时变量的使命就完成了,调用析构函数释放临时变量的内存
Position p1 = p;//场景一:
Position p2(p1);//场景二:
//场景三是传参:略
Position(101, 102);//调用完构造函数后立马调用析构函数
Position p3 = Position(3,4);//相当于 Position p3(3,4)
return 0;
}
运行结果:
Position(int x, int y)
Position(const Position&p)
~Position()
Position & operator=(const Position&p)
~Position()
//----------------------------------
Position(const Position&p)
Position(const Position&p)
~Position()
~Position()
~Position()