<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if !mso]>
<object
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui>
</object>
<mce:style><!--
st1/:*{behavior:url(#ieooui) }
-->
<!-- [endif]-->
<!-- [if gte mso 10]>
<mce:style><!--
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
-->
<!-- [endif]-->
[C/C++ Digestion] – Rule of Three,
复制控制
作者:
Jason Lee @
http://blog.csdn.net/jasonblog
日期:
2010-04-13
[1]
复制构造函数
copy constructor
Rule of Three
是指类如果需要析构函数,则通常也需要复制构造函数和赋值操作符。而其实习惯地显示编写这三者本就是一个良好的习惯。因为相较于编译器自动生成的代码,显示编写自己的代码能让程序员对整个程序有着更清晰的认识和把握。
从形式上说,复制构造函数具有单个本类型对象引用的形参(通常用
const
限定修饰),并且函数名与类名相同,因为复制构造函数也是构造函数。比如:
复制构造函数从需要上来看有两种情况,一是有成员在构造函数中分配资源,比如指针
是最典型的例子;二是需要在复制过程做特定工作。
从作用场合来谈,本质上可以看做是至少存在两个对象的情况下需要复制构造函数,因为需要使用其一来对其它对象进行初始化。比如:
1.
根据同类型对象初始化某一对象;我个人觉得在这种情况下,很容易疏忽的一个细节之处是:一般,对构造函数比较生疏的程序员习惯地定义一个默认构造函数后,并且在里面进行指针所需空间的开辟和分配,就会潜意识地以为以后每个该类对象初始化时都会合理地首先对指针成员进行内存分配,然而却没有足够深刻地意识到如果调用了复制构造函数,则不会调用默认函数:
2.
将对象作为普通实参;这种情况最容易与值传递的情况进行联想:传递的是与变量等值的一个临时值,而非同一个变量。同样的,以对象作为普通实参,也需要建立一个临时对象,就需要调用到复制构造函数。比如以下一段毫无意义的代码:
3.
从函数中返回一个普通对象;这种情况的道理与上一种情况一样,两种情况可以出现在一段代码中:
4.
先调用构造函数创建一个临时对象,再调用复制构造函数将该临时对象复制到容器中的每个元素;
5.
使用花括号对数组进行初始化时。
值得记录的是当类具有指针成员时,如果没有显示编写复制构造函数,而使用编译器自动合成的复制构造函数,就很容易出现“指针悬挂”问题。而其实并不只是该问题,当多对象运作时,由于使用了编译器自动合成的复制构造函数,导致成员指针具有相同的地址,这就有点类似静态成员了,实际上多对象操作的都是同一片内存空间。
[2]
赋值操作符
assignment operator
赋值操作符是重载运算符的一种。相较于复制构造函数出现于用于初始化对象的场合,赋值操作符则出现于使用对象进行赋值的场合。实际上,二者通常同时需要,甚至可以看做一体。
[3]
析构函数
destructor
析构函数按照成员在类中的声明次序逆序撤销成员,这与构造函数初始化列表又发生了关系。通常,普通对象在超出作用域时会调用析构函数,比如一个函数中的局部作用域对象;另外一种情况则是删除指向对象的指针,会调用对象的析构函数。如果指针是指向一个
STL
容器或者内置数组,且容器或数组的单元类型是对象的话,也会调用对象的析构函数,并且容器或数组中的元素是按逆序撤销的。
分享到:
相关推荐
Optimization of trace elements using response surface methodology (RSM) for biogas production in dry anaerobic digestion,李红丽,曹霏霏,The effect of trace elements (Fe、Co and Ni) on mesophilic dry...
基于宏基因组学的好氧活性污泥和厌氧消化污泥的种群结构比较,郭建华,彭永臻,好氧活性污泥和厌氧消化污泥对城市污水处理厂的正常运行中扮演核心作用,但其中微生物种群结构十分复杂。近年来对城市污水厂中的
污泥起始浓度及微生物种群对微电流刺激污泥厌氧消化效果的影响研究,袁海平,,针对传统污泥厌氧消化技术存在的污泥生物可降解性低、停留时间长、设施占地面积大、产气率低下等问题,本文通过采用微电流刺激作
厨余和园林垃圾批式厌氧消化研究,刘广青,张瑞红,使用批式厌氧消化法在中温(35±2oC)和高温(50±2oC)的条件下确定厨余和园林垃圾的沼气和甲烷产量。反应物组成为厨余和园林垃圾各�
不同初始pH的微电流作用下污泥厌氧消化的动力学和微生物种群分析,袁海平,,针对传统污泥厌氧消化法技术存在污泥生物可降解性能低、设施占地大、停留时间长、产气率及产气量较低等缺点,本文通过采用微电流
5.3.6 State-of-the-Art – Digestion Strategy Included 98 5.3.6.1 Multidimensional LC MS Approaches 98 5.4 Applications of MD-LC Separation in Proteomics – a Brief Survey 100 5.5 Sample Clean-Up: Ways...
Microwave thermal pretreatment of sewage sludge,王伟,乔玮,Water could absorb microwave and increase temperature rapidly within short time. Municipal wastewater treatment plant sewage sludge was ...
Providing thorough and detailed coverage, the text equips students with a solid understanding of digestion, absorption, and metabolism of fat, protein, and carbohydrates. It covers the biochemistry ...
Qt及Qt Quick开发实战精解Qt and Qt Quick Development Practical Digestion
数据消化点 一组Python代码,用于从API,下载等中提取数据。最终输出TBD,但可能涉及SQLite,JSON和TSV。 magic_cards.py从mtgjson.com文件创建报告,Magic Arena甲板导出Magic_games.py从Magic Arena的Player.log...
PNS.BAFS+364.2023_Biogas+System+—+Specifications+—+Wet+Anaerobic+Digestion+Process.pdf
digestion 方法用于处理消息反馈结果 judge 方法用于告诉用户消息是否分发到该url中 Probe为探头,被安装在触发器上,针对不同的触发器有不同的探头,一个触发器可以有多种探头,但同时只能安装一个(如果分析实例...
stacks_data_extraction.sh从Stacks 2.3d中提取相关指标以优化参数denovo_pipeline.sh在优化的参数组合上运行denovo_map.pl,并准备用于谱系构建的数据M.musculus_insilico_digestion_parallel_SbfI_MseI.R运行参考...
REDigest REDigest:用于基因或完整基因组序列的硅胶限制性内切酶分析的Python GUI依存关系REDigest是写在Python3,不适合python2和它的依赖。 要使用REDigest,必须安装以下依赖项(对于python3,版本≥) tkinter...
我们当今世界面临的最大挑战是固体废物管理。 这成为许多发展中国家无法解决的问题。 在不影响环境的情况下,通过对废物进行有机分割,将固体废物转化为有价值的能源的一种方法称为厌氧消化法。...