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 的布局容器,此章介绍的布局 ...
随机推荐
- Servlet创建、编译、部署、运行
最近在做一个通过Servlet实现后台批量接收上传文件的东西,现将Servlet的开发.运行配置.调用记录下来.我们以最简单的FileUpload为例,目前所有的http协议相关的Servlet均继承 ...
- Linux 目录与文件的基本操作
1 目录与文件 1.1 文件 硬盘中的数据在操作系统中的体现为文件. 1.2 目录 目录的概念不是文件集合.目录和文件一样,目录也是文件.目录是找到文件的“踏板”.目录的本质是路径映射. 1.3 Li ...
- 表达式:使用API创建表达式树(3)
一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...
- shell脚本学习之case例子
case和select结构在技术上说并不是循环, 因为它们并不对可执行代码块进行迭代. 但是和循环相似的是, 它们也依靠在代码块顶部或底部的条件判断来决定程序的分支. 在代码块中控制程序分支 ca ...
- hadoop 分片与分块,map task和reduce task的理解
分块:Block HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为64MB.与单磁盘文件系统相似,存储在 HDFS上的文件均存储为多个块,不同的是, ...
- 从 man 指令起步(info简介)
前言 小生认为一切指令的学习首先要从帮助入手,深入了解它的功能,即使是在实际项目中我们都离不开它的帮助.因为我们不一定能够记住全部指令的全部的相关功能,因此,查看指令的帮助是我们的不二选择. 正文 下 ...
- ICE学习第三步-----Slice语言
ICE:Slice语言(一)-编译 Introduce简介 Slice(Specification language for ice)是分离对象和对象的实现的基础的抽象机制.Slice在客户端和服务器 ...
- 【Linux】vi编辑器命令
1)进入vi的命令 vi filename : 打开或新建文件,并将光标置于第一行首 vi +n filename : 打开文件,并将光标置于第n行首 ...
- Sass学习
1.1下载地址: http://rubyinstaller.org/downloads 2.1 安装 SASS是Ruby语言写的,但是两者的语法没有关系.不懂Ruby,照样使用.只是必须先安装Ruby ...
- DataTable举例
// clrTest1.cpp: 主项目文件. #include "stdafx.h" using namespace System; using namespace System ...