临时对象与拷贝构造函数
来源:互联网 发布:mac apache 目录 编辑:程序博客网 时间:2024/06/04 20:06
百度百科:拷贝构造函数
拷贝构造函数,是一种特殊的构造函数,它由编辑器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。
一直认为对象初始化 函数值传参 函数值返回 是调用拷贝构造函数的。现在感觉理解片面,没理解问题的根源。拷贝构造函数的调用和临时对象初始化脱离不了关系。
对象以自己为拷贝进行初始化的时候调用会调用以自身类型为参数类型的构造函数,也就是拷贝构造函数。
函数值传参,值返回的时候会产生临时对象,临时对象会以原来的对象进行初始化工作。
所有以上三种情况调用拷贝构造函数是因为对象以自身为拷贝进行初始化或临时对象以自身为拷贝进行初始化导致的。
另外,还要注意C++的重载与隐藏规则对构造函数定义产生的影响。
除了传参和返回值产生临时对象,隐式转换、无名对象也会产生临时对象,调用的是相应的构造函数初始化。
class BB { public: ~BB(){ ;} }; // 经测试 拷贝构造函数是构造函数中的一种,const Class& objSelf 是一个默认的版本 ,编译器一定会默认生成的 // 初始化时候(包括临时对象的初始化:传参 返回值 -以自身作为参数构造 ) 可能以自身作为参数构造,只要相应的构造函数满足条件,就会调用 //这也就是赋值 函数传参 函数返回值 会调用拷贝构造函数。 //隐式转换会产生临时对象 这种临时对象初始化时调用符合传参的构造函数,而不是拷贝构造函数。 //无名对象会产生临时对象 //函数的值传参 值返回会产生临时对象 class AA { public: AA(){ ; } ~AA(){}; AA( const AA& aa , int nn = 100 ) { int n = 100; } AA( const BB& aa ) //这个也可能发生在传参和返回值时的隐式类型转换 ,不会再调用const Class& objSelf 版本的拷贝构造函数 { //这种构造函数容易和强转重载 发生二义性 ; } //参数仅仅以const修饰作为重载会产生调用不明确 }; AA test_bb( AA a ) { BB b; return b; } ////////////////////////////////////////////////////////////////////////// void main() { { // AA a = AA(); //产生临时对象 // AA ab = BB(); // BB bb; AA a1; AA a2 = a1; // //AA aa = bb; test_bb(a1); int n = 10; } }
- 临时对象与拷贝构造函数
- 临时对象与拷贝构造函数
- 【题目】C++拷贝构造函数与C++临时对象
- 返回临时对象时的拷贝构造函数问题
- C++中的临时对象(拷贝构造函数)(上)
- C++中的临时对象(拷贝构造函数)(下)
- C++中的临时对象(拷贝构造函数)(上)
- C++中的临时对象(拷贝构造函数)(下)
- C++中的临时对象(拷贝构造函数)
- object构造、拷贝构造、析构、临时对象
- 临时对象的(构造函数与析构函数)
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- C++拷贝构造函数、无名临时对象以及NRV优化分析
- 函数返回类的对象与拷贝构造函数
- C++类对象之间复制,拷贝构造函数的作用,深拷贝与浅拷贝
- 拷贝构造函数 与 拷贝赋值函数
- 拷贝构造函数 与拷贝复制函数
- 拷贝构造函数与赋值构造函数
- 大家来讨论怎么写概要设计
- styleFloat和cssFloat
- Tomcat 7 的七大新特性
- 导图 SQL Server之数据库对象管理 之 视图管理
- java 中遍历Map的几种方法
- 临时对象与拷贝构造函数
- 通过javascript修改文本框内容后提交后无效
- 网页中常用的js收集
- Android中的Intent详细讲解
- Java客户端通过HttpURLConnection连接Web服务器的Session保存问题
- 关于MAC上面Eclipse使用SVN插件问题
- 最短摘要生成
- Google Play应用商店开发者账号注册教程
- this 关键字