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. Eclipse中文语言包下载

    Kepler .Juno . Indigo语言包: http://www.eclipse.org/babel/downloads.php 其他低版本Eclipse语言包下载: http://archi ...

  2. Java基础知识强化之集合框架笔记33:Arrays工具类中asList()方法的使用

    1. Arrays工具类中asList()方法的使用 public static <T> List<T> asList(T... a): 把数组转成集合 注意事项: 虽然可以把 ...

  3. ASP.NET和支付宝合作开发第三方接口的注意事项

    最近公司和支付宝合作开发第三方接口的项目,这里把过程中需要注意的地方说明一下: 前提:一般来说单个银行不接收个人或私企开通支付接口.因此,和第三方支付公司合作,签订合约开放接口就是通行的做法. 流程: ...

  4. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String

    http://blog.csdn.net/agileclipse/article/details/17161225 详情请点击链接查看

  5. 【转】 C++库常用函数一览

    本文中提到的函数库有:<string> <cctype> <algorithm> <cmath> <cstdlib> <iomanip ...

  6. UILabel的高度自适应

    _content = [UILabel new]; _content.text = @"日落时分,沏上一杯山茶,听一曲意境空远的<禅>,心神随此天籁,沉溺于玄妙的幻境里.仿佛我就 ...

  7. iOS里面如何同时使用开启ARC的库 和 没有开启 ARC的库,ARC 与非 ARC同时存在的问题

    旧工程配置arc方案: 1,直接在targets->build phases中修改compiler Flags,是否支持arc.添加:-fobjc-arc,就可以让旧项目支持arc. 新工程配置 ...

  8. 【转】 wpf系列-入门

    转自:http://www.cnblogs.com/huangxincheng/category/388852.html   8天入门wpf—— 第八天 最后的补充 摘要: 从这一篇往前看,其实wpf ...

  9. Codeforces 474E - Pillars

    一眼看上去非常像最长不下降子序列. 然后比赛的时候对每个答案长度为k的序列,维护最后一个数的最大值和最小值. 当时不知道为什么认为从长度最长倒推至前面不会太长,于是心满意足地敲了个O(n^2).结果T ...

  10. chdir 改变当前目录为起始目录

    <?php chdir(dirname(__FILE__));//把当前目录设置为当前目录?> 将 PHP 的当前目录改为 directory. 参数 directory 新的当前目录 返 ...