构造函数、复制构造函数、析构函数混合使用总结
2012-09-27 16:14
169 查看
一、用法
构造函数的用法:类的声明、定义与初始化复制构造函数的用法:复制构造函数总结
2.一些混合使用的例子
1.关于强制类型转换class A { int x; public: A(int i):x(i){cout<<"construct "<<this<<endl;} A(const A& a){x = a.x;cout<<"copy "<<this<<endl;} ~A(){cout<<"delete "<<this<<endl;} void operator=(const A& a){x = a.x;cout<<"= "<<this<<endl;} void get(){cout<<x<<endl;} void set(int i){x = i;} }; int main() { A a(99), b(35); a.get(); a = 1000; //隐式的强制类型转换 + 赋值 a.get(); a = A(2); //显式的强制类型转换 + 赋值 a.get(); a = b; //赋值 a.get(); return 0; }
输出:
construct 0012FF38 //a的构造
construct 0012FF34 //b的构造
99
construct 0012FF30 //临时对象的构造
= 0012FF38 //赋值
delete 0012FF30 //临时对象的析构
1000
construct 0012FF2C //临时对象的构造
= 0012FF38 //赋值
delete 0012FF2C //临时对象的析构
2
= 0012FF38 //赋值
35
delete 0012FF34 //
delete 0012FF38 //
解释:不管是显示类型转换还是隐式类型转换,都有以下一些共同点:
1)先构造一个临时对象,把临时对象赋值给目标,然后析构临时对象
2)由于要构造一个临时对象,必须要有只带一个参数的构造函数
3)由于要用到赋值函数,当类中有指针成员时,要定义自己的复制控制函数
2.两个例子对比看
class A { public: A(){cout<<"construct "<<this<<endl;} A(const A& a){cout<<"copy "<<this<<endl;} ~A(){cout<<"delete "<<this<<endl;} void operator=(const A& a){cout<<"= "<<this<<endl;} A Test(){return *this;} }; int main() { A a; A b = a.Test(); return 0; }输出:
construct 0012FF38 //a的构造
copy 0012FF34 //b的构造(返回值的构造)
delete 0012FF34 //b的析构(返回值的析构)
delete 0012FF38 //a的析构
解释:
L13中,b是返回值的别名,返回值是*this的复制,*this就是a
因此:b = 返回值 = *this的副本 = a的副本
class A { public: A(){cout<<"construct "<<this<<endl;} A(const A& a){cout<<"copy "<<this<<endl;} ~A(){cout<<"delete "<<this<<endl;} void operator=(const A& a){cout<<"= "<<this<<endl;} A Test(){return *this;} }; int main() { A a, b; b = a.Test(); return 0; }
输出:
construct 0012FF38 //a的构造
construct 0012FF34 //b的构造
copy 0012FF30 //返回值的构造
= 0012FF34 //把返回值的内容赋值给b
delete 0012FF30 //返回值的析构
delete 0012FF34 //b的析构
delete 0012FF38 //a的析构
解释:
L13中,把返回值的内容赋值给b,然后返回值析构
相关文章推荐
- 构造函数、复制构造函数和析构函数的总结
- C++构造函数、复制构造函数、赋值操作符、析构函数--个人总结
- (总结)C++的构造函数(初始化列表,缺省/复制和带默认参数的构造函数)和析构函数详解
- C#总结(二)—构造函数和析构函数
- 默认构造函数,复制构造函数,赋值操作符函数,析构函数的调用。
- 第十二章-----第十三章 构造函数 复制构造函数 赋值操作符析构函数 static类成员
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 指针与引用的混合使用总结
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- c++ 使用动态内存分配的类需要显式复制构造函数,赋值构造函数,析构函数
- C++中复制构造函数与重载赋值操作符总结
- 在构造函数中使用new时应注意的事项、析构函数调用
- map中使用CArray提示错误: 没有可用的复制构造函数或复制构造函数声明为“explicit”
- Android混合开发之WebView使用总结
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- String的构造函数,析构函数,复制构造函数,赋值运算符
- 转】MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号
- 构造函数,析构函数,复制构造函数的理解
- 关于默认构造函数、复制构造函数、析构函数、赋值操作的各种测试探索