博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Primer 有感(复制控制)
阅读量:5024 次
发布时间:2019-06-12

本文共 1142 字,大约阅读时间需要 3 分钟。

1.不管类是否定义了自己的析构函数,编译器都 自动执行类中非static数据成员的析构函数。

 

2.如果我们没有定义复制构造函数,编译器就会为我们合成一个。合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。

    所谓逐个成员,指的是编译器将现有对象的每个非static成员,依次复制到正创建的对象。合成复制构造函数直接复制内置类型成员的值,类类型成员使用该类的复制构造函数进行复制。数组成员的复制是一个例外。虽然一般不能复制数组,但如果一个类具有数组成员,则合成复制构造函数键复制数组。复制数组时合成复制构造函数将复制数组的每一个元素。(注意指针类型)

 

3.复制构造函数的参数一般是const的引用。合成的复制构造函数只完成必要的工作。只包含类类型成员或内置类型(但不包括指针类型)成员的类,无须显式的定义复制构造函数,也可以复制。

 

4.为防止复制,类必须显式声明其复制构造函数为private。类的友元和成员仍可以进行复制。如果想要连友元和成员总的复制也禁止,就可以声明一个(private)复制构造函数当不对其定义。声明而不定义成员函数时合法的,但是,使用未定义成员的任何尝试将导致链接失败。

    注意:不允许复制的类对象只能作为引用传递给函数或从函数返回,它们从不能用作容器的元素。

 

5.合成赋值操作符它会执行逐个成员 赋值:右操作数对象的每个成员赋值给左操作数对象的对应成员。除数组之外,每个成员用所属类型的常规方式进行赋值。对于数组,给每个数组元素赋值。

 

6.撤销一个容器(不管是标准库容器还是内置数组)时,也会运行容器中的类类型元素的析构函数。容器中的元素总是按逆序撤销:首先撤销下标为size()-1的元素,然后是下标为size()-2 的元素......直至最后撤销下标为0的元素。

 

7.不管怎样,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。(撤销内置类型成员或复合类型的成员没有什么影响。尤其是,合成析构函数并不删除指针成员所指向的对象

 

8.因为不能指定任何形参,所以不能重载析构函数。虽然可以为一个类定义多个构造函数,但只能提供一个析构函数,应用于类的所有对象

    析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成的析构函数仍然运行。即:用户自己定义了析构函数,合成的析构函数仍然运行。且先运行自己定义的析构函数再运行合成的析构函数。

转载于:https://www.cnblogs.com/wangfengju/p/6173015.html

你可能感兴趣的文章
关于 UIWebView 几个高级用法
查看>>
maven创建的项目中无法创建src/main/java 解决方案
查看>>
华为软件开发云测评报告二:代码检查
查看>>
集合1
查看>>
js 原生 ajax
查看>>
关键词 virtual
查看>>
建造者模式(屌丝专用)
查看>>
UVALive 4730 Kingdom +段树和支票托收
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
在Macos下完美解决Adobe Dreamweaver CC 2018 汉化及操作方法
查看>>
【转】 Newtonsoft.Json高级用法
查看>>
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
bug记录_signalr执行$.connnection.testhub结果为空
查看>>
【转】常用的latex宏包
查看>>