类的复制控制

新建一个类对象时,类的构造函数会对其初始化,许多时候需要使用一个已经存在的对象去复制出同类的一个或多个新对象,这个时候就需要使用到类的复制构造函数。有些情况需要同类对象之间互相赋值,就像A=B一样,这就是赋值函数的工作。当对象的作用域结束或动态分配的对象被删除时,就应自动调用析构函数释放对象获取的所有资源。复制构造函数是一种特殊的构造函数。具有单个形参,这个参数采用对象的引用的形式。赋值函数其实就是赋值操作符=。析构函数是构造函数的互补。

复制构造函数、赋值函数和析构函数总称为复制控制。当类没有自己定义这些操作,编译器会自动提供一套默认的复制控制函数以方便用户的使用。但编译器提供的复制控制函数非常精炼,它们只做一些必需的工作——默认复制构造函数只简单地复制类中每个数据成员的值,默认赋值函数与默认复制构造函数类似执行逐个成员赋值,默认析构函数则什么都不做。因此,对某些类而言,依赖于默认定义会导致灾难性的错误,尤其是在类具有指针成员或者类中使用到动态内存分配时,使用默认复制控制函数就只能做到浅拷贝。浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量的名称不同,那么对于指针,浅拷贝中仅仅是复制了指针变量的值,而并没有复制指针指向的数据,也即对其中任何一个对象的改动都会影响另外一个对象。这个时候就需要类定义自己的复制控制成员以实现深拷贝。深拷贝是指源对象与拷贝对象互相独立,改动任何一个对象的都不会对另外一个对象造成影响。

当程序中需要根据另一个同类型的对象显式或隐式初始化一个对象时,当函数的参数为类对象且采用值传递方式时,当函数的返回值是类对象时都需要使用到复制构造函数。撤销类对象时会自动调用析构函数,所以当函数的返回值是类对象时,在对象值传递完毕后就会自动调用析构函数。类对象参与表达式运算时,如A=B+C,在右值计算完毕赋值给左值时需要用到赋值函数。总体来说,如果一个类重载了运算符,那么在一个运算表达式中将需要使用到所有复制控制函数。根据“三法则”规则,如果类需要析构函数,则它也需要赋值操作符和复制构造函数。

时间: 2024-11-12 17:12:34

类的复制控制的相关文章

C++ 类的复制控制

写了又删,删了又写,才发现这一章节不好描述. 那就假定个前提吧,假定已经知道: ① C++的类有构造函数. ② 如果不提供任何构造函数,那编译器会生成默认的无参构造函数--默认构造函数只会进行成员变量的初始化. ③ 如果提供了任何一个构造函数,那编译器就不会再生成默认的无参构造函数. ④ 函数的形参都是实参的副本(引用类型除外). ⑤ 构造函数也是函数. ⑥ 直接初始化是在括号()中,复制初始化则使用=赋值操作符. 在此基础上,稍作推理: 一.如果构造函数是单形参.且形参类型为该类的类型的构造函

复制控制(下)

消息处理示例 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message 类和 Folder 类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message 上有 save 和 remove 操作,用于在指定 Folder 中保存或删除该消息.对每个 Message,我们并不是在每个 Folder 中都存放一个副本,而是使每个 Message 保存一个指针集(set),set 中的指针指向

15.4——构造函数与复制控制

构造函数与继承: (1)构造函数和复制控制成员不能继承,每个类定义自己的,要是没定义就用合成的. 对于基类来说: (1)基本没啥影响,若是只希望派生类来使用,可以定义为protected. 对于派生类来说: (1)派生类构造函数除了初始化自己的成员外,还要初始化基类(这个先进行). (2)若是合成的派生类默认构造函数,它将先调用基类的合成默认构造函数,再接着根据常规变量初始化自己的. (3)定义默认构造函数时的初始化列表可以只写派生类的,会自动隐含的调用基类的. (4)不能直接初始化继承类的成员

第十九篇:复制控制( 下 ) --- 自定义析构函数

前言 经过前两篇随笔( 上  中 )的分析我们已经解决了具有指针成员的同类对象“ 干涉 ”问题.可惜,前面给出的解决方案代码还是不完整.还有什么问题呢?观察发现,构造函数里面有new的关键字出现,也就是说开辟了新的内存空间,我们也知道new必须也只能对应一个delete,而不应该让系统自己处理( 还不熟练new和delete用法的点这里 ),但这里和new对应的delete去哪里了? 解决思路 应该何时delete?显然,应该在对象销毁的时候delete.C++中定义了这样一种函数 --- 析构

稍微深入点理解C++复制控制【转】

通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销该类的对象时会发生什么. 2.复制构造函数(copy constructor)是一种特殊的构造函数,具有单个形参,该形参(常用const)是对该类类型的引用: 当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用复制构造函数: 当将该类的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造

C++拾遗(六)——复制控制

年前忙了几天,到现在才算是有空休息下来.先祝大家新年快乐,心想事成:)我也会发笑脸o.o 这篇博文主要介绍定义一个类型的对象时的复制控制方式,这部分内容之前有一定的了解但又浅尝辄止,始终感觉没能找到要点.年前又拿起书细细品读,算是有了一点新的了解.几天前就想动笔了,一直没时间,拖到现在. 每种类型定义了创建该类型的对象时会发生什么——构造函数定义了该类类型对象的初始化.类型还能控制复制.赋值或撤销该类型的对象时会发生什么——类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制这些行为.

C++之重载String ----- 构造函数、复制控制、重载操作符

本博文 我们通过 重新实现String类 来说明构造函数,复制控制,重载操作符. 一.构造函数(包括析构函数): 1:默认构造函数: 2:用户自己定义的构造函数 注意:当用户自己定义时,也要明确显示默认构造函数,这是因为,当我们没有定义自己的构造函数时,编译器会为我们自动合成一个,而我们定义了构造函数时,编译器默认构造函数改为我们自己定义的.这时就有可能出现错误: 3:析构函数: 具体声明与实现,代码如下: 1 声明部分: 2 String(); 3 String(const char*s);

C++复制控制

1.复制构造函数可用于: (1)根据另一个同类型的对象显示或隐式初始化一个对象 string str1="test";   //隐式 string str2=str1; //显示 str1为先调用string的字符串形参的构造函数,创建一个临时对象,然后,使用string复制构造函数将str1初始化为那个临时对象的副本. (2)复制一个对象,将它作为实参传给一个函数 (3)从函数返回时复制一个对象 当形参为非引用类型的时候,将复制实参的值.类似地,以非引用类型作返回值时,将返回retu

c++OOP之复制控制 ------复制构造函数、赋值重载、析构

本博文我们讨论OOP复制控制的一些内容: 首先考虑对象复制的时机: 非引用类型 1):根据一个类去显式或者隐式初始化一个对象: 2):复制一个对象,将它作为实参传给一个函数: 3):从函数返回时复制一个对象.(string tolittle(string word)) 一个空类,编译器提供默认无参数构造函数.拷贝构造函数.赋值运算符以及析构函数,一共四个函数.(面试) 11.复制构造函数.赋值运算符以及析构函数,称为三法则,一旦提供了其中一个,务必提供其余两个.以String为例: a) 涉及到