1.复制构造函数定义形式
<类名>::<复制构造函数名>(const <类名>&<对象名>)
Test(const Test&t)
2.调用时机
(1)用类的已知对象定义该类的一个正在被创建的对象
Test u;
Test t = u;//调用复制构造
(2)对象作为实参传递给函数形参
Test u;
Test t(u);
(3)对象作为函数返回值
Test u;
Test fun()
{
Test t;
return t;//调用复制构造
}
复制构造函数的格式如下: class (const & obj){/*函数体*/}如果在定义类时没有定义一个复制构造函数,那么在调用复制构造函数时,编译器就会自动生成一个复制构造函数,这个构造函数只是单纯地把数据成员一个个地复制到新的对象中,那么,当对象的成员包含有指针时,那么新的对象中的指针成员和旧的对象中的指针指向的是同一块内存,这就是所谓的浅复制.所以当数据成员包含指针时,一定要自己定义一个复制构造函数.而复制构造函数的使用可以用()和=来调用(姑且把这个说法当成是正确的),他们区别如下:1.当用()调用时,如class a; class b(a);这时就是定义了一个新的对象b,b的内容和a中的完全一样.但是千万要注意,不能够用class a;class b;b(a)这样的方法来初始化b,这样是通不过编译的.因为在执行class b这条语句时,b后面没有参数,所以系统会调用默认构造函数来初始化b(如果你自定义了新的构造函数,但是又没有写无参的构造函数的话,这条语句也会报错,显示no match function for xxx之类的),b已经被初始化的,所以就不需要再次构造了,下面再调用b(a)的话,就是等于把b构造了两次,所以是通不过编译的.2.当用=号时,表面看上去是调用了赋值构造函数,实际上涉及的是赋值运算符的重载,这与构造函数和赋值构造函数是差不多的,当没有自定义时,系统将会自动生成一个拷贝赋值运算符,这个操作同样也会有浅复制和深复制这类问题.
复制构造函数的使用
复制构造函数可以用一个对象去初始化另一个对象。在创建类时如果没有编写构造函数,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! //函数返回对象
1.复制构造函数定义形式
<类名>::<复制构造函数名>(const <类名>&<对象名>)
Test(const Test&t)
2.调用时机
(1)用类的已知对象定义该类的一个正在被创建的对象
Test u;
Test t = u;//调用复制构造
(2)对象作为实参传递给函数形参
Test u;
Test t(u);
(3)对象作为函数返回值
Test u;
Test fun()
{
Test t;
return t;//调用复制构造
}
转载于:https://www.cnblogs.com/Faiz-room/p/6182123.html
C++ 的复制构造函数经常会使用在对象复制的时候。
使用场所:
1 产生副本的时候。如class AAA; AAA a; AAA b(a);
2 对象作为参数传递给函数的时候,对象作为返回值返回的时候。
I 格式:
声明
类名(const 类名& another)
定义
类名::类名(const 类名& another)
II 如果自己不写 系统会有默认复制构造函数。一旦自定义,系统不会再提供。
III 系统提供的默认的复制构造函数 是等位拷贝 浅拷贝。
IV 浅拷贝 会导致内存充析构。会有double free的问题。
V 在类中有堆内存产生的时候,要自己实现深拷贝。
友员
1 同类之间无隐私。
2异类之间有友员。
3 a是b的友员,则通过b的对象去访问b的private成员。
4友员不能继承。
5友员不能传递。