复制构造函数的使用
复制构造函数可以用一个对象去初始化另一个对象。在创建类时如果没有编写构造函数,C++会自动生成一个,用原对象相应数据成员的值去初始化新对象的每个数据成员。如果数据成员是对象,初始化意味着调用他们的复制构造函数。
定义
复制构造函数的参数是本类的const引用,无返回类型,按照如下格式定义
ClassName (const ClassName &objectName);
在某个代码中像类似这样:
//main1.cpp
#include <iostream>
#include <string>
using namespace std;
class testStr {
public:
testStr(string s); //构造函数声明
testStr(const testStr &s1); //复制构造函数声明
void display();
private:
string str;
};
testStr::testStr(string s) :str(s) {
}
testStr::testStr(const testStr &s1) { //复制构造函数的定义,此处复制构造函数在原成员
str = s1.str + "World!"; //字符串后面添加一段字符串,用于验证复制构造函数
} //是否被调用
void testStr::display() {
cout << str << endl;
}
void fun(testStr a) { //向函数传递对象时,实际是传递对象的副本,
a.display(); //此时复制构造函数被调用
}
testStr fun1() { //函数返回类型为类时,调用复制构造函数
testStr b("Hello");
return b;
}
int main() {
testStr obj1("Hello");
testStr obj2(obj1); //显示调用复制构造函数
testStr obj3 = obj1; //隐式调用复制构造函数
testStr obj4(" ");
fun(obj1); //向函数传递对象,复制构造函数被调用
obj4 = obj1; //赋值运算,复制构造函数没有被调用
obj3.display();
obj4.display();
testStr obj5(" "); //
obj5 = fun1();
obj5.display();
return 0;
}
复制构造函数的应用场景
1显示调用
2隐式调用
3像函数传递对象
4函数返回对象
注意,复制构造函数只用于创建对象的时候,而不能用在对象的赋值上,例如在mian1.cpp中main函数obj4。
main1.cpp的执行结果
HelloWorld! //fun(obj1) 向函数传递对象
Hello //
HelloWorld! //显示调用
HelloWorld! //隐式调用
Hello
HelloWorld! //函数返回对象