为什么要自己写构造函数和析构函数
2014-04-28 18:01
225 查看
为什么要自己写构造函数和析构函数
“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”
的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。
类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化
拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用
String a(“hello”);
String b(“world”);
String c = a; // 调用了拷贝构造函数,最好写成 c(a);
c = b; // 调用了赋值函数
如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a, b 为例,假设a. m_ data 的内容为“hello”,b .m _data 的内容为“world”。现将a 赋给b,缺省赋值函数的“位拷贝”意味着执行b .m _data = a. m_ data。这将造成三个错误:一是b. m_ data 原有的内存没被释放,造成内存泄露;二是b. m_ data 和a. m_ data 指向同一块内存,a 或b 任何一方变动都会影响另一方;三是在对象被析构时,m_ data 被释放了两次。
“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”
的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。
类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化
拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用
String a(“hello”);
String b(“world”);
String c = a; // 调用了拷贝构造函数,最好写成 c(a);
c = b; // 调用了赋值函数
如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a, b 为例,假设a. m_ data 的内容为“hello”,b .m _data 的内容为“world”。现将a 赋给b,缺省赋值函数的“位拷贝”意味着执行b .m _data = a. m_ data。这将造成三个错误:一是b. m_ data 原有的内存没被释放,造成内存泄露;二是b. m_ data 和a. m_ data 指向同一块内存,a 或b 任何一方变动都会影响另一方;三是在对象被析构时,m_ data 被释放了两次。
相关文章推荐
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不可以声明为虚函数,而析构函数可以
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数?
- 浅谈自己对构造函数、析构函数、复制构造函数的理解
- 为什么构造函数不能虚而析构函数可以虚,以及在什么情况下来使用析构函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数、析构函数可以抛出异常吗?为什么?
- 设计模式中的单例模式的代码为什么析构函数会多次被调用,而构造函数只调用一次?
- C++中为什么析构函数可以是虚函数,而构造函数不可以是虚函数?
- 构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 为什么构造函数不可以声明为虚函数,而析构函数最好声明为虚函数
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数和析构函数的作用是什么?什么时候需要自己定义构造函数和析构函数?
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- 构造函数、析构函数可以抛出异常吗?为什么?(一道百度面试题)