【C++基础】复制构造函数,析构函数的调用情况
来源:互联网 发布:暗黑2优化高清补丁 编辑:程序博客网 时间:2024/05/20 19:31
ps:看书的时候总被复制构造函数,析构函数所困扰,动不动就”这时候,某某情况下调用复制构造函数(或析构函数)”,上网查了一些资料,查看了一些相关书籍,做了一些总结。
复制构造函数和析构函数的作用:
什么时候调用复制构造函数?
1,新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。这种情况很多,最常见的情况是将新对象显示地初始化为现有的对象。
2,当程序生成了对象副本时,编译器都将使用复制构造函数,具体的说,当函数按值传递对象或函数返回对象时。
具体实例可以参考博文:http://blog.csdn.net/Fredomyan/article/details/6709686
在此联系一个常见的面试题:
class A{private: int value; public: A(int n) { value = n; } A( A other ) { value = other.value; } void Print() { std::cout << value << std::endl; }};int _tmain( int argc, _TCHAR* argv[] ){ A a = 10; A b = a; b.Print(); return 0;}
结果是:编译错误。因为复制构造函数A(A other)传入的参数是A的一个实例,把形参复制到实参会调用复制构造函数,但C++的标准不允许复制构造函数传值参数,所以将会编译出错。
解决办法:把构造函数修改为A(const A& other),也就是把传值参数改成常量引用。
什么时候调用析构函数?
1,如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用。
2,如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动被调用。
3,如果对象是通过new创建的,则它将它驻留在栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动被调用。
4,创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时自动调用其析构函数。
比如:
CMyString& CMyString::operator = ( const CMyString &str ){ if( this != &str ) { CMyString strTemp( str ); char* pTemp = strTemp.m_pData; strTemp.m_pData = m_pData; m_pData = pTemp; } return *this;}这是一个为下面CMyString类型实现异常安全性的赋值运算符函数。
class CMyString{public: CMyString( char* pData = NULL ); CMyString( const CMyString& str ); ~CMyString( void ); private: char* m_pData;};
由于strTemp是一个局部变量,但程序运行到if的外面时也就出了该变量的作用域,就会自动调用strTemp的析构函数,把strTemp.m_pData所指向的内存释放掉。
0 0
- 【C++基础】复制构造函数,析构函数的调用情况
- 复制构造函数被调用的三种情况
- 何时调用构造函数,复制构造函数,析构函数
- 默认构造函数,复制构造函数,赋值操作符函数,析构函数的调用。
- C++——必须使用复制构造函数的情况
- 复制构造函数的调用
- C/C++——构造函数、复制构造函数和析构函数的执行时刻
- 析构函数与虚析构函数的用法,构造函数与析构函数调用情况
- C++——构造函数的不同调用情况
- C++使用复制构造函数的情况
- c++ 构造函数,复制构造函数,赋值构造函数,析构函数调用时机
- C++_避免调用复制构造函数
- 构造函数,析构函数,复制构造函数的理解
- 复制构造函数在什么情况下被调用
- 拷贝构造函数调用的情况
- 构造函数和析构函数的各种调用情况,你清楚吗?
- 关于构造函数和析构函数调用时的多种情况
- C++: 复制构造函数
- Java NIO系列教程
- 线程局部存储(TLS)
- 微信公众平台上修改自定义菜单
- Reactor与Proactor的概念
- poj1469 COURSES 二分匹配模板水题
- 【C++基础】复制构造函数,析构函数的调用情况
- 安装LoadRunner时提示“此计算机上缺少 vc2005_sp1_with_atl_fix_redist”的解决方法
- 深度学习概述_摘录笔记
- 第二周上机项目2长方柱类
- cisco路由器的三种密码配置方法及解释
- background-image属性在IE浏览器下的一点点不同
- google pay billing 支付嵌入中需要注意的问题
- 自定义iOS上双击Home键图切换
- java 操作Excel简单示例