拷贝构造函数和赋值函数的区别_拷贝构造函数怎么写
拷贝构造函数和赋值函数的区别由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“拷贝构造函数怎么写”。
拷贝构造函数和赋值函数的区别
一个类会默认生成它的string()//默认普通构造函数
void string(const string &a)//默认拷贝构造函数,如果自己不实现,会用这个默认的//采用“位拷贝”的方式,对有成员指针的情况,一定有
//问 题, 因为“位拷贝”,指向同一地址空间,自己//实现,改成“值拷贝”
~stirng()//默认析构函数
const string& operation=(const string &a)//默认赋值函数,如果自己不实现,//默认的也是采用“位拷贝”的方式
“位拷贝”,string a(b);
除了a,b对象的地址不一样,但a,b成员对象都指向的同一地址空间。如果delete a, 就会删掉b的内容,所以位拷贝,对有指针成员变量的类,非常危险
拷贝构造函数发生的例子:
Aa(1);//调用构造函数,Ab(a);//调用拷贝构造函数
Ac=a;//第一次赋值,因为对象还没初始化,还是调用拷贝构造函数,c=b;//已经初始化的对象才能调用赋值函数
voidf(Aa);//函数声明
f(c);//实参传递时调用拷贝构造函数,但是编译器会根据具体情况把这个过程优化掉
总结:
1.拷贝构造函数只有在定义一个新的类对象并且用已有的对象进行初始化时调用.2.赋值函数只有在已经初始化(对象已定义)的情况下被调用
例如有一个类叫做‘mycla',并有一个实例:b
那么,myclaa=b;//拷贝构造函数
myclaa;
a=b;//赋值
两者调用的时间不一样,第一种情况下,a此时还没有被分配空间,在扶植的同时还要生成资源;
第二种情况下,a一构造完成,已经有了资源,所以此时等号只进行赋值。