C++复制控制
1.复制构造函数可用于:
(1)根据另一个同类型的对象显示或隐式初始化一个对象
string str1="test"; //隐式
string str2=str1; //显示
str1为先调用string的字符串形参的构造函数,创建一个临时对象,然后,使用string复制构造函数将str1初始化为那个临时对象的副本。
(2)复制一个对象,将它作为实参传给一个函数
(3)从函数返回时复制一个对象
当形参为非引用类型的时候,将复制实参的值。类似地,以非引用类型作返回值时,将返回return语句中的值的副本。
(4)初始化顺序容器中的元素
vector<string> svec(5);
编译器首先使用string默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到svec的每个元素。
(5)根据元素初始化式列表初始化数组元素
如果没有为类类型数组提供元素初始化式,将使用默认构造函数初始化每个元素。然而,如果使用常规的花括号括住的数组初始化列表来提供显示元素初始化式,则使用复制初始化来初始化每个元素。
2.合成的复制构造函数
如果我们没有定义复制构造函数,编译器就会为我们合成一个。然而,有些类必须对复制对象时发生的事情加以控制。这样的类经常有一个数据成员是指针,或者有成员表示在构造函数中分配的其他资源。这样的情况下,我们必须定义复制构造函数。
class Foo
{
public:
Foo(); //default constructor
Foo(const Foo&); //copy constructor
}
3.禁止复制
(1)可以将类显示声明其复制构造函数为private
(2)如果连友元和成员中的复制也禁止,就可以声明一个private复制构造函数,但不对其定义。
声明而不定义成员函数是合法的,但是,使用未定义成员的任何尝试将导致链接失败。通过声明(但不定义)private复制构造函数,可以禁止任何复制类类型对象的尝试:用户代码中复制尝试将在编译时标记为错误,而成员函数和友元中的复制尝试将在链接时导致错误。
4.赋值运算符
(1)类也有合成的赋值运算符,然而,类也可以定义自己的赋值运算符。一般而言,如果类需要复制构造函数,它也会需要赋值运算符。
5.析构函数
(1)如果类需要析构函数,则他也需要赋值运算符和复制构造函数,这个规则称为“三法则”。
(2)析构函数和复制构造函数或者赋值运算符的一个最重要的区别就是,即使我们编写了自己的析构函数,也会调用合成析构函数。
6.复制构造函数和赋值运算符的区别
复制构造函数只在对象初始化时才被调用,无返回值。而赋值运算符是将一个现存的对象赋予新的值时被调用,有返回值。
C++复制控制的更多相关文章
- C++ 复制控制之复制构造函数
		
7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...
 - C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承
		
面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...
 - C++ Primer 随笔 Chapter 13 复制控制
		
1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...
 - C++Primer笔记之复制控制
		
复制控制这一节需要注意的地方不多,主要有以下几点: 1.定义自己的复制构造函数 什么时候需要定义自己的复制构造函数,而不用系统提供的,主要遵循以下的经验说明: 某些类必须对复制对象时发生的事情加以控制 ...
 - 稍微深入点理解C++复制控制【转】
		
通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销 ...
 - C++拾遗(六)——复制控制
		
年前忙了几天,到现在才算是有空休息下来.先祝大家新年快乐,心想事成:)我也会发笑脸o.o 这篇博文主要介绍定义一个类型的对象时的复制控制方式,这部分内容之前有一定的了解但又浅尝辄止,始终感觉没能找到要 ...
 - C++继承与构造函数、复制控制
		
每个派生类对象由派生类中定义的(非static)成员加上一个或多个基类子对象构成,因此,当构造.复制.赋值和撤销派生类型对象时,也会构造.复制.赋值和撤销这些基类子对象. 构造函数和复制控制成员不能继 ...
 - C++复制控制:拷贝构造函数
		
一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...
 - C++之复制控制
		
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数叫做复制构造函数(有时也称为拷贝构造函数),例如: class Person{ public: Person();/ ...
 
随机推荐
- C#程序
			
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
 - [MongoDB]入门操作
			
摘要 在工作中也经常使用mongodb,每次遇到新的操作都需要去查,比较麻烦,准备在博客中系统的学习一下mongodb.首先在本地安装mongodb环境,可以下载一个windows的版本. 官网地址 ...
 - ThreadStart和ParameterizedThreadStart区别
			
ThreadStart: ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数. ThreadStart threadStart=new Thre ...
 - 【最新】2015年7月之15个最新jQuery插件
			
Hello,一个激动人心的好消息,现在我为大家整理最近7月发布的jQuery插件. 如果你熟悉任何下面列出的插件,请分享你的反馈与我们的读者,或如果你知道哪一个我们没有收录,那么请与我们分享在下面的评 ...
 - [转载]JavaScript内存分析
			
https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools/blob/master/md/Performance-Profiling/javasc ...
 - 在Linux下和Windows下遍历目录的方法及如何达成一致性操作
			
最近因为测试目的需要遍历一个目录下面的所有文件进行操作,主要是读每个文件的内容,只要知道文件名就OK了.在Java中直接用File类就可以搞定,因为Java中使用了组合模式,使得客户端对单个文件和文件 ...
 - [译]Node.js面试问与答
			
原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...
 - 面试集锦-常量,const, const 对指针的影响
			
在C语言中不可改变的数据(量)就是常量 在C语言中有三种常量 字面量(直接量),就是直接写出来的,从写法上就可以看出值与类型等,例如:19,123.456等 名字常量 ...
 - BSA基础数据维护
			
平台 BSA基础数据维护 .扇区五个字段的内容 本来值为0,经过107上计算解析,得出正常的数值.然后106上报(200050),得到回复(200051). 查看回复数据,是否有错误.比如提示104 ...
 - XDU 1160 - 科协的数字游戏I
			
Problem 1160 - 科协的数字游戏I Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 184 ...