cprime复制控制复制构造函数,赋值控制,

cprime复制控制复制构造函数,赋值控制,

ID:30360279

大小:178.83 KB

页数:18页

时间:2018-12-29

cprime复制控制复制构造函数,赋值控制,_第1页
cprime复制控制复制构造函数,赋值控制,_第2页
cprime复制控制复制构造函数,赋值控制,_第3页
cprime复制控制复制构造函数,赋值控制,_第4页
cprime复制控制复制构造函数,赋值控制,_第5页
资源描述:

《cprime复制控制复制构造函数,赋值控制,》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、Cprime复制控制复制构造函数,赋值控制,复制控制当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造函数或赋值操作符,编译器(通常)会为我们定义。复制构造函数是一种特殊构造函数,具有单个形参,该形参(常用 const 修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或函数返回该类型的对象时,将隐式使用复制构造函数。不管类是否定义了自己的析构函数,编译器都自动

2、执行类中非 static 数据成员的析构函数。在下一章我们将进一步学习操作符重载,本章中我们先介绍赋值操作符。与构造函数一样,赋值操作符可以通过指定不同类型的右操作数而重载。右操作数为类类型的版本比较特殊:如果我们没有编写这种版本,编译器将为我们合成一个。复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。通常,编译器合成的复制控制函数是非常精练的——它们只做必需的工作。但对某些类而言,依赖于默认定义会导致灾难。实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认版本。有一种特别常见的情况需要类定义自己的复制控制

3、成员的:类具有指针成员。复制构造函数只有单个形参,而且该形参是对本类类型对象的引用(常用 const 修饰),这样的构造函数称为复制构造函数。与默认构造函数一样,复制构造函数可由编译器隐式调用。复制构造函数可用于:根据另一个同类型的对象显式或隐式初始化一个对象。复制一个对象,将它作为实参传给一个函数。从函数返回时复制一个对象。初始化顺序容器中的元素。根据元素初始化式列表初始化数组元素。当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象(第 7.

4、3.2 节),然后用复制构造函数将那个临时对象复制到正在创建的对象:     string null_book = "9-999-99999-9"; // copy-initialization     string dots(10, '.');               // direct-initialization     string empty_copy = string();       // copy-initialization     string empty_direct;                // direct-initializa

5、tion创建 dots 时,调用参数为一个数量和一个字符的 string 构造函数并直接初始化 dots 的成员。创建 null_book 时,编译器首先调用接受一个 C 风格字符串形参的 string 构造函数,创建一个临时对象,然后,编译器使用 string 复制构造函数将 null_book 初始化为那个临时对象的副本。empty_copy 和 empty_direct 的初始化都调用默认构造函数。对前者初始化时,默认构造函数函数创建一个临时对象,然后复制构造函数用该对象初始化 empty_copy。对后者初始化时,直接运行 empty_direct 的默认构

6、造函数。通常直接初始化和复制初始化仅在低级别上存在差异。然而,对于不支持复制的类型,或者使用非 explicit 构造函数(第 12.4.4 节)的进修,它们有本质区别:     ifstream file1("filename"); // ok: direct initialization     ifstream file2 = "filename"; // error: copy constructor is private     // This initialization is okay only if     // the Sales_item(con

7、st string&) constructor is not explicit     Sales_item item = string("9-999-99999-9");file1 的初始化是正确的。ifstream 类定义了一个可用 C 风格字符串调用的构造函数,使用该构造函数初始化 file1。看上去等效的 file2 初始化使用复制初始化,但该定义不正确。由于不能复制 IO 类型的对象(第 8.1 节),所以不能对那些类型的对象使用复制初始化。item 的初始化是否正确,取决于正在使用哪个版本的 Sales_item 类。某些版本将参数为一个 strin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。