由于修在学习C++的时候类的设计不可避免,而修在创建了类的时候经常会把复制构造函数和赋值运算符搞混,所以开帖特别记忆一下。
一、定义:
1.赋值构造函数接受其所属类的对象作为参数,来创建一个新的类对象。
2.赋值运算符用于处理同类对象之间的赋值,用”=“表示。
二、使用范围及形式说明:
1.复制构造函数原型如下:
1 | Star(const Star &) |
在以下情况下使用复制构造函数:
①将新对象初始化为一个同类的对象
②按值将对象传递给函数
③函数按值返回对象
④编译器产生临时对象
2.赋值运算符(注意与初始化的区别):
1 2 3 4 | Star siriue; Star alpha = sirus;//初始化 Star dogstar ; dogstar = sirus;//赋值 |
赋值运算符用于修改已有对象的值,如果没有动态内存分配可以使用默认的赋值运算符,否则可能需要重载。
由于在类初始化时,编译器会自动为类生成一些成员函数,包括默认的构造函数,复制构造函数和赋值运算符。所以在不需要特殊操作的情况系,无需重新定义。
三、对比
这里用C++perimer plus edition 6书编程练习的一个例子做对比。
复制构造函数:
1 2 3 4 5 6 7 8 9 | Cd::Cd(const Cd & d) { performers = new char[strlen(d.performers)+1]; label = new char[strlen(d.label)+1]; strcpy(performers,d.performers); strcpy(label,d.label); selections = d.selections ; playtime = d.playtime; } |
赋值运算符:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Cd & Cd::operator=(const Cd & d) { //赋值前要删除原来的空间 if(this == &d) { return *this ; } delete [] performers; delete [] label ; performers = new char[strlen(d.performers)+1]; label = new char[strlen(d.label)+1]; strcpy(performers,d.performers); strcpy(label,d.label); selections = d.selections ; playtime = d.playtime; return *this; } |
程序详见:https://github.com/ghostxiu/CplusplusPrimerPlus6thEditions/tree/master/Chapter13/cd1.cc
四、其他
还要注意赋值运算符和转换函数的区别。
近期评论