#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass(int i = 0)
{
cout << i;
}
MyClass(const MyClass &x)
{
cout << 2;
}
MyClass &operator=(const MyClass &x)
{
cout << 3;
return *this;
}
~MyClass()
{
cout << 4;
}
};
int main()
{
MyClass obj1(1), obj2(2);
MyClass obj3 = obj1;//调用拷贝构造函数
return 0;
}
输出为:
122444
拷贝构造函数用于5种情况:
(1)根据另一个同类型的对象显式或隐式初始化一个对象
(2)复制一个对象,将它作为实参传递给函数
(3)从函数返回复制一个对象
(4)初始化顺序容器中的元素
(5)根据元素初始化列表初始化对象数组
代码及分析如下
#include <iostream>
using namespace std;
class Point
{
private:
int x, y;
public:
Point(int _x = 0, int _y = 0):x(_x), y(_y)
{
cout << "constructor" << endl;
}
Point(const Point& b)
{
x = b.x;
y = b.y;
cout << "copy constructor" << endl;
}
};
Point global;
//将实参传递给该函数时,会调用拷贝构造函数
Point foo_bar(Point arg)
{
Point local = arg; //调用拷贝构造函数,用同类型对象初始化,不能与赋值操作符混淆
Point *heap = new Point(global); //与上一个一样
*heap = local;
Point pa[4] = {local, *heap}; //数组中前两个用初始化列表参数,然后调用拷贝构造函数,后两个调用默认构造函数
return *heap; //函数返回时,调用拷贝构造函数
}
int main()
{
foo_bar(global);
return 0;
}
输出为
constructor
copy constructor
copy constructor
copy constructor
copy constructor
copy constructor
constructor
constructor
copy constructor