http://blog.csdn.net/lwbeyond/article/details/6202256
拷贝函数调用时机
- 对象以值传递方式传入函数参数
- 对象以值传递方式从函数返回
- 对象需要通过另外一个对象进行初始化(注意与初始化后,=区别)
例题1
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; //调用拷贝构造函数
// 最终程序输出 122444
return 0;
}
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;
obj3 = obj1; //调用operator =
// 最终程序输出 1203444
return 0;
}
例题2
例子3
#include <iostream>
using namespace std;
int cnt = 1;
class A{
public:
int a;
A(){
cout << "A()"<< endl;
}
A(const A& u) // 拷贝构造函数
{
cout << cnt++ << " " << "copy A()" << endl;
}
};
A f(A u)
{
A v(u);
A w = v;
cout << "before return" << endl;
return w;
}
int main()
{
A x;
cout << "begin" << endl;
A y = f(x);
cout << "end" << endl;
return 0;
}
程序运行后的结果如下:
#include <iostream>
using namespace std;
int cnt = 1;
class A{
public:
int a;
A(){
cout << "A()"<< endl;
}
A(const A& u) // 拷贝构造函数
{
cout << cnt++ << " " << "copy A()" << endl;
}
};
A f(A u)
{
cout << "before f" << endl;
A v(u);
A w = v;
cout << "before return" << endl;
return w;
}
int main()
{
A x;
cout << "begin" << endl;
A y = f(f(x));
cout << "end" << endl;
return 0;
}
程序运行后的结果如下:
浅拷贝例题
sayHello退出的时候调用析构函数,delete p; 因为属于浅拷贝,所以参数中的b中的A * p与 main函数中的B b中的A * p 是一份内存。
函数自己退出时,调用析构函数 delete p;
main函数退出,调用析构函数 delete p;(重复delete,导致程序崩溃)
- 可以自定义拷贝构造函数,实现深拷贝