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 的布局容器,此章介绍的布局 ...
随机推荐
- 亲测linux上安装mysql
1.rpm -ivh MySQL-server-5.6.19-linux_glibc2.5.x86_64.rpm(这是复制过来的,用Tab键自动补齐吧)2.rpm -ivh MySQL-client- ...
- phpnow安装教程
点评:搭建 PHP 其实不很难,只是有点繁琐.要是自己搭建一次 PHP + MySQL 环境很是费时.更糟的是,很多新手在配置 PHP 时常常出现这样那样的问题.诸如 mysql 扩展.zend 安装 ...
- IOS 播放动态Gif图片
图片分为静态和动态两种,图片的格式有很多种,在开发中比较常见的是.png和.jpg的静态图片,但有的时候在App中需要播放动态图片,比如.gif格式的小表情头像,在IOS中并没有提供直接显示动态图片的 ...
- Stream类
为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...
- 关于HTTP请求报文和响应报文学习笔记
超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层的一种通信协议.它是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接 ...
- HTML5 文件域+FileReader 分段读取文件并上传(七)-WebSocket
一.单文件上传实例 HTML: <div class="container"> <div class="panel panel-default" ...
- [笔记]SD卡相关资料
ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...
- 用java写bp神经网络(四)
接上篇. 在(一)和(二)中,程序的体系是Net,Propagation,Trainer,Learner,DataProvider.这篇重构这个体系. Net 首先是Net,在上篇重新定义了激活函数和 ...
- 在模型中获取网络数据,刷新tableView
model .h #import <Foundation/Foundation.h> #import "AFHTTPRequestOperationManager.h" ...
- Linux fork操作之后发生了什么?又会共享什么呢?
今天我在阅读<Unix网络编程>时候遇到一个问题:accept返回时的connfd,是父子进程之间共享的?我当时很不理解,难道打开的文件描述符不是应该在父子进程间相互独立的吗?为什么是共享 ...