1.复制控制包含的内容:复制构造函数、赋值操作符、析构函数

2.复制构造函数:

  a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数

  b. 适用情况:

     (1)根据一个类型的对象显示或隐式的初始化一个对象。

     (2)复制一个对象,将它作为参数传给一个函数

     (3)从函数返回时复制一个对象

     (4)初始化顺序容器中的元素(?)

     (5)根据元素初始化列表初始化数组元素(?)

3.C++中两种初始化的形式:直接初始化和复制初始化。

  a.直接初始化使用=符号,而直接初始化将初始化式放在圆括号中!但当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。

 string null_book = "9-99-999-99-9"; //copy initialization
string dots(,'.'); //direct initialization
string empty_copy = new string(); //copy initialization
string empty_direct; //direct initialization

  b.通常直接初始化和复制初始化仅在低级别优化上存在差异。但是不支持复制的类型或使用explicit构造函数的时候,他们有本质的区别:

 ifstream file1("filename");//ok :direct initialization
ifstream file2 = "filename";//error: copy constructor is private;

4.赋值操作符

  a.合成赋值操作符:会执行逐个成员赋值:有操作数对象的每个成员赋值给做操作数对象的对应。除数组外,每个成员所属类型的常规方式进行赋值。对于数组,给每个数组元素赋值

  b.赋值操作符的返回类型应该与内置类型赋值运算返回的类型相同。内置类型的赋值运算返回对有操作数的引用,因此,复制操作符也返回对同一类类型的应用。

 class Sales_item{
public:
Sales_item & operator = ( const Sales_item &);
}

  c.复制和赋值常一起使用

5.析构函数:

  a.撤销对象时会自动调用析够函数,撤销容器中的元素总是按逆序撤销。

  b.许多类不许要显示析够函数,只有当有些工作需要析够函数完成时,才需要析够函数。

  c.三法则:如果需要析够函数,则它也许要复制操作符和复制构造函数。

  d.合成析够函数:逆序撤销每个非static成员。

6.管理指针成员的三种方法:

  a.指针成员采取常规指针型行为。这样的类具有指针的所有缺陷但无需特殊的复制控制。

    (1)默认复制/赋值与指针成员(注:以下HasPtr是个简单的带指针成员变量的类)         

 int obj = ;
HasPtr ptr1(&obj, ); //int * member points to obj ,val is 42
HasPtr PTRW(PTR1); //int * member ponts to obj,val is 42

    (2)指针共享同一个对象

    (3)可能出现悬垂指针  

  b.类可以实现所谓的“智能指针”行为。指针所指向的对象是共享的,但类能够防止悬垂指针。


 class U_ptr {
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p):ip(p),use(){}
~U_Ptr(){ delete ip;}
}; //引入的计数器类

 c.类采取值型行为。指针所指向的对象是唯一的,由每个类对象独立管理。
  class HasPtr {
public:
HasPtr(const int &p,int i):ptr(new int(p),val(i)) {}
HasPtr(const HasPtr &org):ptr(new int(*org.ptr)),val(orig.val){}
HasPtr& operator=(const HasPtr&);
~HasPtr(){ delete ptr;}
private:
int *ptr;
int val;
};

C++ Primer 随笔 Chapter 13 复制控制的更多相关文章

  1. C++ Primer 随笔 Chapter 4 数组和指针

    1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int  arr[10]; 其中 int 是类 ...

  2. C++ Primer 随笔 Chapter 9 顺序容器

     参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...

  3. C++ Primer 随笔 Chapter 2 变量和基本类型

    2.1C++内置类型 C++ 算术类型 类型 含义 最小存储空间(随机器不同而不同) bool 布尔型 --- char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 i ...

  4. C++ Primer 随笔 Chapter 10 关联容器

    1.关联容器的类型:map(键-值对的集合,可理解为关联数组), set(单纯的键的集合), multimap(一个键对应多个值,键唯一), multiset(相同键可以是多个). 2.pair类型提 ...

  5. C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承

    面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...

  6. C++Primer笔记之复制控制

    复制控制这一节需要注意的地方不多,主要有以下几点: 1.定义自己的复制构造函数 什么时候需要定义自己的复制构造函数,而不用系统提供的,主要遵循以下的经验说明: 某些类必须对复制对象时发生的事情加以控制 ...

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

    通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销 ...

  8. Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项:

    Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项: 到目前为止,这本书的大部分章节 集中在特定的几个部件, 这个章节覆盖了方法和子程序 可以被任 ...

  9. 零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I

    原文:零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局 ...

随机推荐

  1. Java语言基础(六)

    Java语言基础(六) 前一章提到的, BigDecimal, DecimalFormat等具体用法,这里就不在说了,网上有许多 一.下面让我们看一个例子(自由落体运动位移) 说明: (1).公式是 ...

  2. mysql 存储过程项目小结

    1. false :0  true 1 切记 官方文档:http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html BOOL,  ...

  3. Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历

    1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...

  4. POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象

    给两个凸包,求这两个凸包间最短距离 旋转卡壳的基础题 因为是初学旋转卡壳,所以找了别人的代码进行观摩..然而发现很有意思的现象 比如说这个代码(只截取了关键部分) double solve(Point ...

  5. <input value="hidden">的作用

    这样子上个页面的参数可以保存在这个页面,为下个页面获取参数做准备,在这个页面表单提交的时候下个页面可以获取参数

  6. VS2015升级Update2之后Cordova程序提示:此应用程序无法在此电脑上运行

    VS2015在升级到Update2之后,有可能出现如下异常,在运行Cordova项目时提示: 查看输出面板会有乱码错误信息: 出现此问题的原因是在于npm程序损坏了.vs调用的npm程序并不是在nod ...

  7. Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志

    一.spring aop execution表达式说明 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义 ...

  8. 《gzip命令》-linux命令五分钟系列之七

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  9. JS call和apply用法(转)

    每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会 感到奇怪,一个函数可能会有属于它自己的方法,但是记住, ...

  10. JQuery焦点Table

    ;;} .table-bordered{;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .table{mar ...