operator=函数.
首先讲一下为什么要写operator=函数.
这是一个不得不解决而又容易忽视的问题!
当我们写一个类的时候, 正常情况下不需要为该类重载=运算符, 因为系统为每个类提供了默认的赋值运算符, 该操作会
把这个类的所有数据成员都进行一次=的操作进行赋值, 如果有以下类
class Point
{
public:
flaot x;
float y;
float z;
};
那么对这个类的对象进行的任何赋值操作都是正常的.
比如Point a;
a.x = 0;
a.y = 0;
a.z = 0;
Point b = a;
那么b中的所有值和a一样, 正常.
这时我们应该庆幸, 系统为我们提供了一个免费的=运算符, 省去了不少麻烦.
但是如果有以下代码, 问题就会出来.
class AwfulObject
{
public:
AwfulObject(){pArry = new int[10];}
virtual ~AwfulObject(){delete []pArry;}
private:
int* pArry;
};
这时我们再进行
AwfulObject a;
AwfulObject b = a;
这样的操作就会出错. 当进行析构的时候,两个指针重复delete了一块内存, 所以我们必须写自己的operator=.
接着讲一下如何写operator=函数.
1.解决上述产生的问题
知道了问题的原因所在, 就知道怎么下手了, 下面是参考写法
class GoodObject
{
public:
GoodObject(){pArry = new int[10];}
virtual ~GoodObject(){delete []pArry;}
GoodObject(const GoodObject& rhs)
{
*this = rhs;
}
GoodObject& opreator=(const GoodObject& rhs)
{
if (this != &rhs)
{
if (pArry != NULL)
{
delete []pArry;
}
pArry = new int[10];
for (int i=0; i<10; ++i)
{
pArry[i] = rhs.pArry[i];
}
}
return *this;
}
private:
int* pArry;
};
2.为什么opreator=要返回*this?
为了支持a=b=c这样的连锁调用
3.为什么不返回const GoodObject&?
为了和编译器(a=b)=c这样的操作兼容
4.为什么要传入const GoodObject& rhs
主要支持一下操作:
GoodObject a;
const GoodObject b;
a = b;
5.为什么要有if (this != &rhs)这样的判断
主要是避免自我赋值a=a这样的情况发生.
6.不要忘记重写拷贝构造函数
以上代码未经调试, 出错的地方或有不好的地方请大侠指教~_~.
参考资料:Effective C++ 条款15, 16, 17
转载或修改请说明出处
链接:http://blog.csdn.net/howlet2/archive/2009/12/28/5090756.aspx
作者:howlet
E-Mial: howlet3@126.com
operator=函数.相关推荐
- C++学习笔记-----operator=函数处理自赋值
很多时候我们需要对类使用赋值运算符operator=函数来将一个类赋值给令一个类,但是如果类的成员变量中存在指针类型的变量,而且这个指针的内存是从heap内存中申请的时候,在实现赋值运算符函数的时候要 ...
- C++中对象初始化赋值是否需要调用operator=函数
一般对于初始化类变量有两种方式: A a; A b = a; 另一种方式是: A a ; A b; a =b; 对于第一种方式,编译器相当于在b的初始化的时候,用a的引用作为复制构造函数的参数进行操作 ...
- C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)
八.如何写出一个安全的operator= 首先,operator=的返回值通常是一个类的引用,这一点需要和C++标准库的容器类的operator=保持一致 其次,如果一个类中含有指针成员,那么要防止自 ...
- python之operator操作符函数
operator函数主要分为以下几类:对象比较.逻辑比较.算术运算和序列操作. 举例: #python 3.4 >>> operator.eq(1,2) False >> ...
- 一文说尽C++赋值运算符重载函数(operator=)
http://www.cnblogs.com/zpcdbky/p/5027481.html 在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是, ...
- C++:函数指针进阶(四):函数对象operator()
C++中的 operator() 有两大主要作用: 1:Overloading --------重载() 操作符 2: Casting------实现对象类型转化 1:Overloading重载() ...
- 自动分析源代码,创建函数地图展示调用关系
极客讨论器现在可以自动分析 C/C++/Java/C#/Python/Objective-C 语言源代码并生成表示调用关系的函数地图,并使用"旅游"模式,在函数地图中浏览代码.如图 ...
- C++——运算符的重载---以成员函数方式重载---以友元函数方式重载
一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...
- 函数对象、 函数对象与容器、函数对象与算法
一.函数对象 1.函数对象(function object)也称为仿函数(functor) 2.一个行为类似函数的对象,它可以没有参数,也可以带有若干参数. 3.任何重载了调用运算符operator( ...
最新文章
- Nature Methods | 用深度多任务神经网络探索单细胞数据
- UVA1629 Cake slicing
- Oracle 原理:序列
- jggrid标红列和动态标红行的几种方法
- jQuery Mobile中列表项ol、ul中的li的data-*选项
- Ubuntu14.04(LTS)gitHub客户端安装
- 毕设项目 - 基于SSM的教师工作考核绩效管理系统(含源码+论文)
- Python爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
- latex模板中生成PDF出错
- 服务器私有信息,私有服务器
- [转]什么?你还不会写JQuery 插件
- 8月1日任务 11.14-11.17
- 购房置业者必上的10大房产网站
- 自己动手写服务器-1
- 助力 AI 银行发展 网易智企打造一站式金融服务
- 国内商务邮箱哪个好用?电子邮箱怎么申请?
- 百亿互刷宝php 站长,百度排名百亿互刷宝
- 数字示波器FFT分析
- Soul网关-day17
- 2w多字总结的VUE学习文档