十三、复制控制

1. 复制构造函数

类中的成员函数都默觉得inline类型。所以即使在类定义体内的函数声明显示定义为inline类型,在进行函数定义时也可以将inline进行省略。

// 复制构造函数应该为常量引用类型,假设同意传值參数会造成无限循环调用从而导致内存溢出。

CopyConstruct(const CopyConstruct& a){value = a.value;}

复制构造函数可用于初始化顺序容器中的元素,如vector<string> svec(5);

这样的方式使用了默认构造函数和复制构造函数。

编译器首先使用string的默认构造函数创建一个暂时值来初始化svec然后使用复制构造函数将暂时值拷贝到svec的每个元素。

数组成员是个例外,假设类具有数组成员。合成复制构造函数将复制数组,它将复制数组的每个元素。注意指针只复制字面值。



复制构造函数在向函数传递该类型的对象和从函数返回该类对象时隐式调用。因此不应该将复制构造函数指定为explicit。



仅仅包括类类型或内置类型(但不包括指针类型的)的类无需显式的定义复制构造函数。

当类有一个成员为指针类型或有成员在构造函数中分配的其它资源,这两种情况下都必须定义复制构造函数。

有些类须要全然禁止复制,如iostream类。假设想禁止复制,类必须显式声明其复制构造函数为private。

此时编译器将拒绝用户代码,不论什么进行复制的尝试。

可是此时在友元和类的成员中还能够进行复制。假设也想禁止它们,能够声明一个private复制构造函数,但不正确其定义。注意是定义。而不是把它定义为一个空的复制构造函数。

声明而不定义成员函数是合法的。可是使用没有定义成员函数的不论什么尝试都将导致链接失败。声明private的复制构造函数后,用户代码不论什么复制类类型对象的尝试都将导致语法错误。而在友元和成员函数的调用将导致链接错误。

假设定义了复制构造函数,编译器就不会合成默认构造函数了。

2. 赋值操作符

假设类未定义自己的赋值操作符,则编译器会合成一个。

赋值操作符的返回类型返回对左/右操作数的引用。且赋值操作符函数必须为类的成员函数,由于赋值必须是类的成员。參数列表中第一个形參为this指针,被省略了。

合成赋值操作符函数与合成复制构造函数操作类似,它也会运行逐个成员赋值。

一般而言假设类须要定义复制构造函数。它也会须要赋值操作符。

3. 析构函数

动态分配的对象仅仅有在该对象的指针被删除时才撤销。

当动态分配对象的引用或指针超出作用域时,不会执行析构函数。

仅仅有显式调用delete才会调用析构函数。但进程结束时会撤销。

假设类须要析构函数,则它也须要赋值操作符和复制构造函数,这被称为三法则。

编译器总会为我们合成一个析构函数,合成的析构函数按对象创建时的逆序撤销每一个非static成员。

对于类类型的成员,合成析构函数会调用该成员的析构函数来撤销对象。

合成析构函数并不删除指针成员所指向的对象。所以一般定义自己的析构函数以释放那些资源。

析构函数与复制构造函数或赋值运算符的一个重要差别是:即使我们编写了自己的析构函数,合成构造函数仍然执行。析构函数仅仅能有一个。

注意:这里使用的是执行。合成构造函数调用成员为类类型的析构函数,用于撤销成员。

4. 管理指针成员

大多数C++类採用下面三种方法之中的一个管理指针成员:

1:指针成员採取常规指针型行为。即不处理。

2:使用智能指针。採取引用计数来控制来管理贡献对象。

     class U_Ptr {
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p): ip(p), use(1) { }
~U_Ptr() { delete ip; }
};

3:一个指向对象只。每个对象都有其自己的副本。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【C++ Primer】拷贝控制的更多相关文章

  1. C++ Primer : 第十三章 : 拷贝控制之对象移动

    右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...

  2. C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理

    定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...

  3. C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁

    拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没 ...

  4. C++ Primer 笔记——拷贝控制

    1.如果构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是引用类型(否则会无限循环的调用拷贝构造函数). 2.如果没有为一个类 ...

  5. 【C++ Primer 第13章】2. 拷贝控制和资源管理

    拷贝控制和资源管理 • 类的行为像一个值.意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响. • 行为像指针的类则共享状态.当我们拷贝一个 ...

  6. 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁

    拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...

  7. 【C++ Primer | 15】构造函数与拷贝控制

    合成拷贝控制与继承 #include <iostream> using namespace std; class Base { public: Base() { cout << ...

  8. 【C++ Primer 第十三章】4. 拷贝控制示例

    拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> us ...

  9. [C++ Primer] : 第13章: 拷贝控制

    拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...

  10. 《C++ Primer》笔记 第13章 拷贝控制

    拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么.拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么.析构函数定义了当此类型对象销毁时做什么.我们称这些操作为拷贝控制 ...

随机推荐

  1. php学习之路:WSDL详细解释(两)

    3.定义服务使用的逻辑消息 当服务的操作被调用时.服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素. 这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息 ...

  2. css Tab选项卡1

    利用   锚点原理 以及overflow:hiden 结合,实现纯  css  tab 方式 兼容ie6 + 适合单个tab   不需要js          注意点  红色方框的   a 对应a   ...

  3. PC远程调试设备(转)

    我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题——调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...

  4. Oracle数据表被drop后的恢复

    对于被drop的表和索引,都会存放在回收站中(所以对于生产的数据库必须设置好回收站功能) 由于本次生成环境在drop掉已有的表后,又一次创建了很多的表,全部直接还原的话会提示原有对象存在,表名反复.当 ...

  5. unity3D实际的原始视频游戏开发系列讲座10它《战斗:外来入侵》在第一季度游戏开发

    解说文件夹 <保卫战:异形入侵>游戏开发 第一讲   游戏演示和资源的介绍 第二讲  "异形"怪物的实现 第三讲  "异形"怪物生命值的体现 第四讲 ...

  6. Docker contanier comunication with route

    2台宿主机,hslave1 192.168.1.153, hslave2 192.168.1.154 修改网段 docker0默认网段是172.17.0.0/16,修改154机器的docker0的网段 ...

  7. 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。

    原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...

  8. CentOS安装KVM步骤虚拟机,绝对实用!

    KVM(Kernel-based Virtual Machine)速记.这是rhel5.4最新的虚拟化技术启动,现在只支持红帽64位rhel5.4在执行KVM,硬件必须支持同一时间VT技术,网上找 ...

  9. PHP第三个教训 PHP基本数据类型

    学习平台: 1.php七种变量类型 2.isset和empty到这两个功能区分 3.型式试验 4.自己主动类型转换 5.类型转换 注意: 1.通过 变量->方法名 来调用.  $user1 = ...

  10. c语言获取符号位整数和浮点

    1. 为什么你应该得到的签位 非常多的时间,我们需要推断的数目值正和负,做了相应的逻辑处理.完成这一要求条件推断语句可以很好. 有时会出现以下情况, if (x > 0) { x = x - 1 ...