`
luliangok
  • 浏览: 775576 次
文章分类
社区版块
存档分类
最新评论

为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符

 
阅读更多

为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
摘自effectiveC++第11条

例如这个类里没有声明赋值操作符和拷贝构造函数,这会带来一些不良后果。

class CFoo
{
public:
CFoo() {data = new char[10];}
~CFoo() {delete [] data;}

// 没有拷贝构造函数和operator=

private:
char *data;
};
CFoo a, b;

当b = a时,因为没有自定义的operator=可以调用,c++会生成并调用一个缺省的operator=操作符。这个缺省的赋值操作符会执行成员指针的赋值操作。

第一,b成员指针曾指向的内存永远不会被删除,因而会永远丢失,产生内存泄漏。第二,现在a和b包含的成员指针指向同一个字符串,那么只要其中一个析构时,就会删除掉另一个指针还指向的那块内存。

CFoo c = a时,会调用拷贝构造函数,因为它也没有在类中定义,c++以与处理赋值操作符一样的方式生成一个拷贝构造函数并执行相同的动作:对对象里的指针进行逐位拷贝。这会导致同样的问题,但不用担心内存泄漏,因为被初始化的对象还不能指向任何的内存。不过,假如c被a初始化后,成员指针会指向同一个地方,那这个地方会被删除两次。

对于有些类,可以确信程序中不会做拷贝和赋值操作的时候,可以只声明这些函数(声明为private成员)而不去定义(实现)它们。这就防止了会有人去调用它们,也防止了编译器去生成它们。
分享到:
评论

相关推荐

    Effective.C++.中文第二版.50条款doc文档.chm

    条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符 条款12: 尽量使用初始化而不要在构造函数里赋值 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同 条款14: 确定基类有虚析构...

    新手学习C++入门资料

    为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是函数不会用到这个参数。下面给出使用了无名参数的C++函数代码: int fun(int x,int) //注意不同点...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     13.1.1 拷贝构造函数 440  13.1.2 拷贝赋值运算符 443  13.1.3 析构函数 444  13.1.4 三/五法则 447  13.1.5 使用=default 449  13.1.6 阻止拷贝 449  13.2 拷贝控制和资源管理 452  13.2.1 行为像值的类 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     13.1.1 拷贝构造函数 440  13.1.2 拷贝赋值运算符 443  13.1.3 析构函数 444  13.1.4 三/五法则 447  13.1.5 使用=default 449  13.1.6 阻止拷贝 449  13.2 拷贝控制和资源管理 452  13.2.1 行为像值的类 ...

    经典C/C++面试题目大汇总(全附答案).doc

    流操作符和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 以上 2-8 参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx<br>9. 结构与联合有和...

    C++编程思想习题

    12.5.2为一个类重载new和delete 12.5.3为数组重载new和delete 12.5.4构造函数调用 12.5.5对象放置 12.6小结 12.7练习 第13章 继承和组合 13.1组合语法 13.2继承语法 13.3构造函数的初始化表达式表 13.3.1成员对象...

    传智播客扫地僧视频讲义源码

    18_浅拷贝问题解决_深拷贝_显示编写拷贝构造函数 19_深拷贝和浅拷贝_默认的等号操作符也是浅拷贝_传智扫地僧 20_构造函数的初始化列表 21_强化训练1_构造和析构调用顺序 22_强化训练2_匿名对象生命周期 23_强化训练3...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     3.2.1 赋值操作符   3.2.2 增量赋值   3.2.3 多重赋值   3.2.4 “多元”赋值   3.3 标识符   3.3.1 合法的python标识符   3.3.2 关键字   3.3.3 内建   3.3.4 专用下划线标识符   3.4...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     3.2.1 赋值操作符   3.2.2 增量赋值   3.2.3 多重赋值   3.2.4 “多元”赋值   3.3 标识符   3.3.1 合法的python标识符   3.3.2 关键字   3.3.3 内建   3.3.4 专用下划线标识符   3.4...

    84、智能指针的原理、常用的智能指针及实现.pdf

    对⼀个对象进⾏赋值时,赋值操作符减少左操作数所指对象的引⽤计数(如果引⽤计数为减⾄0, 则删除对象),并增加右操作数所指对 象的引⽤计数 e.调⽤析构函数时,构造函数减少引⽤计数(如果引⽤计数减⾄0,则删除...

    Python核心编程第二版(ok)

     3.2.1 赋值操作符   3.2.2 增量赋值   3.2.3 多重赋值   3.2.4 “多元”赋值   3.3 标识符   3.3.1 合法的Python标识符   3.3.2 关键字   3.3.3 内建   3.3.4 专用下划线标识符   3.4...

    Python核心编程第二版

     3.2.1 赋值操作符   3.2.2 增量赋值   3.2.3 多重赋值   3.2.4 “多元”赋值   3.3 标识符   3.3.1 合法的Python标识符   3.3.2 关键字   3.3.3 内建   3.3.4 专用下划线标识符   3.4...

    c.c++找工作面试重点结构图-mindmanager

    (7) 在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。 在虚继承体系中的通过virtual继承而来的基类 继承子类与父类关系 具体化 类的层次通常...

    C++智能指针的原理和实现.pdf

    (2) auto_ptr 的对象所有权是独占性的,使⽤拷贝构造和赋值操作符时,会造成对象所有权的转移,被拷贝对象在拷贝过程中被修改; (3) 基于第⼆条,因此不能将auto_ptr放⼊到标准容器中或作为容器的成员; (4) auto_...

    语言程序设计课后习题答案

    对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。 面向对象的方法将数据...

    开学了,有路网团购太便宜啦! C++编程惯用法(高级程序员常用方法和技巧)/深入C++系列(C++ Strategies and Tactics)

    10.1 一个负面的声明 10.2 为什么需要异常? 10.3 一个异常的例子 10.4 异常只应该用来表述异常情况 10.5 理解异常 10.6 责任评估 10.7 设计异常对象 10.8 小结 10.9 问题 第11章 向C++移植 11.1 选择使用C++ ...

    最新名企标准通用C++面试题,

    10.如何定义和实现一个类的成员函数为回调函数? 如果类的成员函数是一个callback函数, 必须宣告它为"static",才能把C++ 编译器加诸于函数的一个隐藏参数this去掉。 11.C++里面是不是所有的动作都是main()引起...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题11:谈谈对拷贝构造函数和赋值运算符的认识 面试题12:写出当定义#define _INMAIN 0和不定义时代码打印结果 第9章 继承与多态 9.1 继承 面试题1:指出程序的错误 面试题2:用C++设计一个不能被继承的类 9.2 虚...

    在一小时内学会 C#(txt版本)

    正如其名字说的,一旦它们已经进行了写操作、直接初始化或在构造函数中对其进行了赋值,readonly 数据成员就只能对其进行读取。readonly 和 const 数据成员不同之处在于 const 要求你在声明时进行直接初始化。看下面...

    C++MFC教程

    此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。 CPoint:用来表示一个点的坐标,有两个成员变量:x y。 可以和另一个点相加。 CString:用来表示可变长度的字符串。使用...

Global site tag (gtag.js) - Google Analytics