加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

C++ 复制构造函数分析

发布时间:2021-12-10 18:01:42 所属栏目:教程 来源:互联网
导读:C++类的设计中,如果某些函数没有显式定义,C++会自动生成,复制构造函数便是其中之一,其他的还有默认构造函数、赋值操作符、默认析构函数、地址操作符。一个类的复制构造函数的原型一般为: Class_name (const Class_name ); 一、何时调用复制构造函数 在

C++类的设计中,如果某些函数没有显式定义,C++会自动生成,复制构造函数便是其中之一,其他的还有默认构造函数、赋值操作符、默认析构函数、地址操作符。一个类的复制构造函数的原型一般为: Class_name (const Class_name &);
 
一、何时调用复制构造函数
 
  在新建一个对象并将其初始化为同类对象的时候,常常会调用复制构造函数,如:
 
    Class_name A(B);
 
    Class_name A = B ;
 
    Class_name A = Class_name(B);
 
    Class_name *p = new Class_name(A);// 用A初始化一个匿名对象,并将其地址赋予指针P
 
  每当程序生成对象副本时,编译器都会调用复制构造函数。具体地说,当函数按值传递对象或生成临时对象时,编译器都会调用复制构造函数。如当3个Vector对象相加时,编译器会调用复制构造函数来生成临时对象。
 
二、复制构造函数的浅复制
 
  默认的复制构造函数是浅复制,即逐个复制非静态成员数据的值。
 
  (1)如果类成员是另一个类的对象,那么将调用另一个对象的复制构造函数;
 
  (2)静态成员数据不被复制,因为它们属于整个类,而不是一个对象。
 
  (3)如果成员中含有含有指针P,那么它的地址也会赋给新的对象中相应的P,这样会导致两个或多个变量指向同一个指针——比较危险的一件事。
 
三、复制构造函数的深复制
 
  显式地定义复制构造函数可以有效解决浅复制的弊端。下面以一个自定义的MyString类作为例子:
 
 
 
  假若是使用默认的复制构造函数,则程序很容易崩溃,比如当你创建了对象A,用A初始化B(A和B的str指向同一个地址),然后销毁A(此时A的str指向的内存已被收回),之后你如果想销毁B,则可能使程序崩溃。
 
  解决方法是显式定义复制构造函数:
 
 
 
  在函数中使用动态内存分配,在函数里面也可以显性改变静态数据成员的值。与new相对应,在析构函数中使用delete关键字销毁内存:
 
 
 
  End.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读