昨天看了一下关于拷贝构造函数和赋值构造函数的内容。自己总结了一下拷贝构造函数。
1.自定义的拷贝构造函数中第一个形参一定要为类的引用,后面可以带别的参数。一个类可以有多个拷贝构造函数。
2.一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。同事默认拷贝构造函数是不处理静态成员变量的。
3.拷贝构造函数的调用分为三种情况
1.以对象作为函数参数 2.以对象作为函数返回值 3.用对象初始化另一个对象
4.如果不想让拷贝函数发生,可以主动将拷贝函数声明为私有的
5.拷贝构造函数不处理静态成员变量
6.如果没有自定义赋值构造函数,x x2=x1其实是在调用拷贝构造函数
7.拷贝构造函数存在深拷贝和浅拷贝问题 可以参照 http://blog.csdn.net/lwbeyond/article/details/6202256讲的很详细。
主要是拷贝构造函数对于非基本类型成员变量或者动态申请的变量,是指向同一个内存区域的,会造成不同类修改相互影响以及析构时多次重复析构。
#include <iostream>#include <string.h>
using namespace std;
static int k=1;
class x
{
public :
int temp;
static int num;
int * p;//指针变量
x(int temp)
{
this->temp=temp;
p=new int(100);//动态申请
cout<<"我的构造函数"<<temp<<endl;
num++;
}
x(x& t)//拷贝构造函数的参数一定是引用,不能不是引用,不然会出现无限递归
{
temp=t.temp+k;
k++;
cout<<temp<<"拷贝构造"<<endl;
p=new int;//重新申请新的内存
*p=*(t.p);//但是指向的内容我们一致
num++;//默认拷贝构造函数不处理静态成员变量num,自定义拷贝构造函数要手动处理
}
~x()
{
cout<<temp<<"我的析构函数"<<endl;
num--;
if(p != NULL)
{
delete p;
}
}
};
x a(x t)
{
t.temp=100;
cout<<"此时对象个数"<<x::num<<endl;
return t;
}
int x::num=0;//这里要注意,类的静态成员变量在使用前必须先初始化。
int main()
{
x x1(10);//k=1
cout<<"x1 "<<x1.temp<<" "<<"p的值"<<*(x1.p)<<endl;
x x2=x1;//拷贝函数 以对象初始化另一个对象 k=2
x x3(x1);//拷贝函数 以对象初始化另一个对象 k=3
cout<<"x2 "<<x2.temp<<" "<<"p的值"<<*(x2.p)<<endl;
cout<<"x3 "<<x3.temp<<" "<<"p的值"<<*(x3.p)<<endl;
cout<<"此时对象个数"<<x::num<<endl;
x x4=a(x1);//x1拷贝给参数t, 以对象初始化另一个对象 k=4
//返回t时创建一个变量t',用t进行拷贝,t‘.temp=t.temp+k=100+4 以对象作为函数返回值 k=5
cout<<"x4 "<<x4.temp<<endl;
cout<<"此时对象个数"<<x::num<<endl;
return 0;
}