复制控制

  复制构造函数赋值操作符析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。

  实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认版本。有一种特别常见的情况需要类定义自己的复制控制成员:类具有指针成员。

一、复制构造函数

  特点:只有单个形参;该形参是对本类型对象的引用(const T&)。

  复制构造函数可以用于:

  1. 根据另一个同类型的对象显式或隐式地初始化一个对象。

  2. 复制一个对象,将它作为实参传给一个函数。

  3. 从函数返回时复制一个对象。

  4. 初始化顺序容器中的元素。

  5. 根据元素初始化式列表初始化数组元素。

1.1、初始化:复制初始化和直接初始化

  int i(1024);      //direct initialization.

      int a = 1024;   //copy initialization.

  两者之间的不同:

  直接初始化直接调用与实参匹配的构造函数;复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象:

  string null_book = "aaaaaaaaaa";           //copy initialization

  string dot(10, '.');                               //direct initialization

  string empty_copy = string();               //copy

  string empty_direct;                             //direct

1.2、形参与返回值

  正如我们所知,当形参为非饮用类型的时候,将复制实参的值。类似地,以非引用类型作为返回值时,将返回return语句中的副本。

  当形参或返回值为类类型时,由复制构造函数进行复制。当形参或返回值为类型引用时,不能复制。如:

      //copy constructor used to copy the return value.

      //parameters are references, so they aren't copied.

  string make(size_t, const string&, const string&);

1.3、合成的复制构造函数

  如果我们没有定义复制构造函数,编译器就会为我们合成一个。

  与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数。合成复制构造函数的行为是:执行逐个成员(非static 成员)初始化,将对新对象初始化为原对象的副本

  例如:

class Sales_item {
private:str::string isbn;int sold;double revenue;
}合成复制构造函数如下:Sales_item::Sales_item(const Sales_item&obj)
{isbn(obj.isbn);            //uses string copy construtor
    sold(obj.sold);revenue(obj.revenue);
}

 

二、禁止复制

  有的类需要完全禁止复制。例如:iostream类。

  如果复制构造函数是private的,将不会允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。

  然而,友元和成员仍可以进行复制。如果想要连友元和成员中的复制也禁止,就可以声明一个private复制构造函数但不对其定义

这是因为:声明而不定义成员函数是合法的,但是,使用未定义的成员的任何尝试将导致链接失败。

 

转载于:https://www.cnblogs.com/wiessharling/p/3346112.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python Requests登录GitHub

工具: python 3.6 Fiddler4 所需要的库: requests BeautifulSoup 首先抓包,观察登录时需要什么: 这个authenticity_token的值是访问/login后可以获取,值是随机生成的,所以登录前要获取一下。 注…

你必须懂的 T4 模板:深入浅出

示例代码:示例代码__你必须懂的T4模板:浅入深出.rar (一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。 T4文本模板,即一种自定义规则的代码生成器。根据业务模型可生…

stdafx.h是什么用处, stdafx.h、stdafx.cpp的作用

http://blog.csdn.net/songkexin/article/details/1750396 stdafx.h头文件的作用 Standard Application Fram Extend没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。Windows和MFC的include文件都非常大&#xff0c…

python3 Connection aborted.', RemoteDisconnected('Remote end closed connection without response'

在写爬虫的时候遇到了问题,网站是asp.net写的 requests.exceptions.ConnectionError: (Connection aborted., RemoteDisconnected(Remote end closed connection without response,)) 于是就抓包分析,发现只要加了’Accept-Language’就好了。。。 A…

id和instancetype的区别

id返回不确定类型的对象(也就是任意类型的对象),- (id)arrayWithData;返回的就是不确定类型的对象,如果执行数组的方法, [- (id)arrayWithData objectOfIndex:0]编译时不会报错,但运行时会报错,…

windows下Java 用idea连接MySQL数据库

Java用idea连接数据库特别简单。 首先就是下载好MySQL数据库的驱动程序。 链接:https://dev.mysql.com/downloads/connector/j/ 然后就是选下载版本了: 选个zip格式的嘛。。 下载完后就解压。打开idea,建立个简单的项目 找到这个: …

7-2

#include<stdio.h> int main(void) {int i;int fib[10]{1,1};for(i2;i<10;i)fib[i]fib[i-1]fib[i-2];for(i0;i<10;i){printf("%6d",fib[i]);if((i1)%50)printf("\n");}return 0; } 转载于:https://www.cnblogs.com/liruijia199531/p/3357481.h…

岁月悄然前行,没有停留的痕迹

岁月悄然前行&#xff0c;没有停留的痕迹。月落乌啼&#xff0c;总是千年的风霜;涛声依旧&#xff0c;不见当初的夜晚。走过岁月的痕迹&#xff0c;已是物是人非。我们在岁月的轨道上行走&#xff0c;不要给岁月太多的装饰&#xff0c;不要给岁月太多的言语。给它我们随着时光追…

160 - 41 defiler.1.exe

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg stud_PE LoadPE 先分析一下。 这次的程序要求更改了&#xff0c;变成了这个&#xff1a; defilers reversme no.1 -----------------------The task of this little, lame reverseme is to add some code to…

HDU-2112 HDU Today

http://acm.hdu.edu.cn/showproblem.php?pid2112 怎样把具体的字母的地点转换为数字的函数为题目的重点。 HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11385 Accepted Submission(s): 2663 P…

AndEngine引擎之SmoothCamera 平滑摄像机

SmoothCamera:就相当于现实世界的摄像机&#xff0c;要想照到一个物体&#xff0c;要么是摄像机移动&#xff0c;要么是物体移动到摄像头的范围内&#xff0c;想要放大或缩小一个物体&#xff0c;要么是物体向前或向后移动&#xff0c;要么是摄像头变焦 这里讨论的就是摄像头的…

160 - 44 defiler.1.exe

环境&#xff1a; Windows xp sp3 工具&#xff1a; 1.ollydbg 2.exeinfope 0x00 查壳 无壳就下一步 0x01 分析 随便输入个错的&#xff0c;出现了不知道哪国的语言。有个6&#xff0c;应该就是name的长度要大于6吧 OD载入&#xff0c;搜字符串。 00421BD7 |. 807D…

时间与日期处理

主要有以下类&#xff1a; NSDate -- 表示一个绝对的时间点NSTimeZone -- 时区信息NSLocale -- 本地化信息NSDateComponents -- 一个封装了具体年月日、时秒分、周、季度等的类NSCalendar -- 日历类&#xff0c;它提供了大部分的日期计算接口&#xff0c;并且允许您在NSDate和N…

C++ new/new operator、operator new、placement new初识

简要释义 1.operator new是内存分配函数&#xff08;同malloc&#xff09;&#xff0c;C&#xff0b;&#xff0b;在全局作用域(global scope)内提供了3份默认的operator new实现&#xff0c;并且用户可以重载operator new。 1 void* operator new(std::size_t) throw(std::bad…

160 - 45 Dope2112.2

环境&#xff1a; Windows xp sp3 工具 1.ollydbg 2.exeinfope 0x00 查壳 还是无壳的Delphi程序 0x01 分析 这次继续OD载入搜字符串&#xff0c;但是没找到错误信息的字符串。 又因为是Delphi程序&#xff0c;所以可以试一下这样&#xff1a; OD载入后还是搜字符串&…

编辑技巧 word

怎样给word中的文档加上水印 转载于:https://www.cnblogs.com/dqxu/p/4208372.html

NAT地址转换原理全攻略

NAT转换方式及原理 在NAT的应用中&#xff0c;可以仅需要转换内部地址&#xff08;就是“内部本地址”转换成“内部全局地址”&#xff09;&#xff0c;这是最典型的应用&#xff0c;如内部网络用户通过NAT转换共享上网&#xff1b;也可以是仅需要转换外部地址&#xff08;就是…

通过setTimeout来取消因大量计算造成的网页卡顿

js是单线程的&#xff0c;所以有些大量计算的操作会占用线程资源&#xff0c;导致页面卡住。 今天遇到这样一个场景&#xff0c;选择一个下拉框之后&#xff0c;对数据进行筛选&#xff0c;这个过程中有大量计算&#xff0c;点了selecte的option之后&#xff0c;option不隐藏&a…

160 - 47 DueList.2

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 无壳的程序 0x01 分析 运行后说需要keyfile&#xff0c;那就创建一个。 OD载入找找看需要的keyfile叫什么名字 00401000 > $ 6A 00 push 0x0 …

如何解决Visual Studio2012 与此版本的Windows不兼容

解决方案&#xff1a; http://www.microsoft.com/zh-CN/download/details.aspx?id36020 下载更新转载于:https://www.cnblogs.com/awodefeng/p/3373343.html