C++ Primer 随笔 Chapter 13 复制控制
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 复制控制的更多相关文章
- C++ Primer 随笔 Chapter 4 数组和指针
1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int arr[10]; 其中 int 是类 ...
- C++ Primer 随笔 Chapter 9 顺序容器
参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...
- C++ Primer 随笔 Chapter 2 变量和基本类型
2.1C++内置类型 C++ 算术类型 类型 含义 最小存储空间(随机器不同而不同) bool 布尔型 --- char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 i ...
- C++ Primer 随笔 Chapter 10 关联容器
1.关联容器的类型:map(键-值对的集合,可理解为关联数组), set(单纯的键的集合), multimap(一个键对应多个值,键唯一), multiset(相同键可以是多个). 2.pair类型提 ...
- C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承
面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...
- C++Primer笔记之复制控制
复制控制这一节需要注意的地方不多,主要有以下几点: 1.定义自己的复制构造函数 什么时候需要定义自己的复制构造函数,而不用系统提供的,主要遵循以下的经验说明: 某些类必须对复制对象时发生的事情加以控制 ...
- 稍微深入点理解C++复制控制【转】
通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销 ...
- Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项:
Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项: 到目前为止,这本书的大部分章节 集中在特定的几个部件, 这个章节覆盖了方法和子程序 可以被任 ...
- 零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I
原文:零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局 ...
随机推荐
- 深入掌握JMS--转
深入掌握JMS(一):JSM基础 1. JMS基本概念 JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业应用的开发.它支持 ...
- xcode 6.4模拟器出现多个相同版本:OSX Yosemite 上安装xcode7 beta和xcode6.4
错误现象是:我在OSX Yosemite上同时安装了Xcode 7Beta和Xcode 6.4,然后Xcode 6.4的模拟器出现了重复版本.截图如下: 解决方法是: 删除该路径下的所有文件:~/Li ...
- 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片
项目中运用到pdf文件转换成image图片,开始时使用pdfbox开源库进行图片转换,但是转换出来的文件中含有部分乱码的情况.下面是pdfBox 的pdf转换图片的代码示例. try{ String ...
- 兼容IE浏览器的placeholder【超不错】
jQuery EnPlaceholder plug (兼容IE浏览器的placeholder)使用 >>>>>>>>>>>>&g ...
- noi1816 画家问题(技巧搜索Dfs)
/* Problem 画家问题 假设一个ans数组存的是对每一个点的操作 0表示不图 1表示图 那么 对于原图 g 操作第三行时对第一行没有影响 同样往下类似的 所以 假设我们知道了ans的第一行就是 ...
- css 选择符
css参考手册:css.doyoe.com 在css3中,不同的浏览器可能需要不同的前缀,它表示该css属性或规则尚未成为W3C标准的一部分,是浏览器的私有属性,虽然目前较新版本的浏览器都是不需要前缀 ...
- 45种Javascript技巧大全
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- C语言中,如何通过socket得到对端IP地址
struct sockaddr_in clientaddr1; memset(&clientaddr1, 0x00, sizeof(clientaddr1)); socklen_t nl=si ...
- Express难点解析
app.js 应用程序入口文件1.// view engine setup 设置视图引擎app.set('views', path.join(__dirname, 'views'));//告诉expr ...
- objective-c相关知识点
1,objective-c中实现线程同步: Mutexlock (互斥锁).NSCondition lock (条件锁)消息传送 2,UDP和TCP: TCP :传输控制协议,可以提供面向连接的.可靠 ...