`
shake863
  • 浏览: 638642 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中重载操作符时什么时候定义成友元,什么时候定义为成员方法

阅读更多

在C++语言中,可以用关键字operator加上运算符来表示函数,叫做运算符重载。例如两个复数相加函数:

Complex Add(const Complex &a, const Complex &b);

可以用运算符重载来表示:

Complex operator +(const Complex &a, const Complex &b);

运算符与普通函数在调用时的不同之处是:对于普通函数,参数出现在圆括号内;而对于运算符,参数出现在其左、右侧。例如

Complex a, b, c;



c = Add(a, b); // 用普通函数

c = a + b; // 用运算符 +

如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。

如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一个右侧参数,因为对象自己成了左侧参数。

从语法上讲,运算符既可以定义为全局函数,也可以定义为成员函数。文献[Murray , p44-p47]对此问题作了较多的阐述,并总结了表8-4-1的规则。



运算符
规则

所有的一元运算符
建议重载为成员函数

= () [] ->
只能重载为成员函数

+= -= /= *= &= |= ~= %= >>= <<=
建议重载为成员函数

所有其它运算符
建议重载为全局函数


表8-4-1 运算符的重载规则



由于C++语言支持函数重载,才能将运算符当成函数来用,C语言就不行。我们要以平常心来对待运算符重载:

(1)不要过分担心自己不会用,它的本质仍然是程序员们熟悉的函数。

(2)不要过分热心地使用,如果它不能使代码变得更加易读易写,那就别用,否则会自找麻烦。



不能被重载的运算符

在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。

(1)不能改变C++内部数据类型(如int,float等)的运算符。

(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。

(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。

(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

分享到:
评论

相关推荐

    c++ demo,重载运算符,友元函数的实现

    c++ demo,重载运算符,友元函数的实现

    C++操作符重载ppt

    cpp入门教程-操作符重载: 主要内容为友元和操作符重载主要内容为友元和操作符重载主要内容为友元和操作符。

    西北农林科技大学C++实验题及代码

    重载比较操作符:==、&gt;和&lt;,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。 、、、、、、 2、虚函数 利用虚函数实现多态: (1)设计Person类,要求具有用于表示姓名的保护数据...

    c++重载的详细总结

    1.操作符重载对大部分...4.作为全局(友元)函数重载操作符。这要求操作符重载函数的形参至少有一个为类.结构.枚举或它们的引用类型。 如果操作符重载函数中需要访问形参类的私有成员,则需要把它说明成相应类的友元。

    C++Primer视频(高级)下载地址

    14.14章 重载操作符的定义 15.14章 重载输入输出操作符 16.14章 重载算术操作符 17.14章 重载关系操作符(一) 18.14章 重载关系操作符(二) 19.14章 重载赋值操作符 20.14章 重载下标操作符 21.14章 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    14.1 重载操作符的定义 430 14.2 输入和输出操作符 435 14.2.1 输出操作符的重载 435 14.2.2 输入操作符&gt;&gt;的重载 437 14.3 算术操作符和关系操作符 439 14.3.1 相等操作符 440 14.3.2 关系操作符 441 14.4 赋值操作...

    C++入门经典(第9版) ([美]Walter Savitch著) 中文pdf完整扫描版[302MB]

    第11章 类中的友元函数、重载操作符和数组 第12章 独立编译和命名空间 第13章 指针和链表 第14章 递归 第15章 继承 第16章 异常处理 第17章 模板 第18章 标准模板库 附录1 C++关键字 附录2 操作符的优先级 附录3 ...

    c++语言介绍.ppt

    C++源于C语言。 1970年,两位程序员Brian Kernighan和Dennis Ritchie首创了一种新的程序设计语言,取名为C语言。...函数名重载与操作符重载 动态存储分配 友元函数与内联函数 结构、联合与类

    黄邦勇帅C++专题讲解

    介绍:本文辑是对C++中的部分难点专题进行分章的专门讲解,不是一套完整的教材,但可以做为学习C++的参考,这些专题本人都对C++中难于理解的难点作了重点讲解,并举了实际例子,以及一些容易理解错误的...C++操作符重载专题

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    8.1.4 作为成员函数的操作符重载 218 8.1.5 重载函数调用符 220 8.2 友元函数和自动类型转换 221 8.2.1 构造函数的自动类型转换 221 8.2.2 友元函数 222 8.2.3 友元类 225 8.3 引用和其他操作符重载 226 ...

    从C转向C++(中文)

    C 是一种简单的语言。它真正提供的只有有宏...重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。用C++比用C 具有更宽广的空间,因为设计时 有更多的选择可以考虑。

    从c到c++ EFFECTIVE_C++2E

    对每个人来说,习惯 C++需要一些时间,...重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。用 C++比用 C 具有更宽广的空间,因为设计时 有更多的选择可以考虑。

    程序设计教程 陈家骏等编著

    7.3 作为全局(友元)函数重载操作符 242 7.4 几个特殊操作符的重载 244 7.4.1 赋值操作符= 244 7.4.2 数组元素访问操作符(或下标操作符)[] 246 7.4.3 类成员访问操作符-&gt; 247 7.4.4 动态存储分配与去配操作符new...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    6.2.1 预先了解操作符重载 6.2.2 插入符与提取符 6.2.3 通常用法 6.2.4 面向行的输入 6.3 文件输入输出流 6.4 输入输出流缓冲 6.5 在输入输出流中查找 6.6 strstreams 6.6.1 为用户分配的存储 6.6.2 自动...

    C++编程思想 例子和叙述讲解C++编程

    6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的...

    C++编程思想 编程

    6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的...

    零起点学通C++多媒体范例教学代码

    14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的图书链表 15.2.1 图书链表 15.2.2 类的链表 15.3 动态链表 15.3.1 动态链表的建立 15.3.2 解决输入字符造成死循环的问题 15.3.3 ...

    零起点学通C++学习_多媒体范例教学代码

    14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的图书链表 15.2.1 图书链表 15.2.2 类的链表 15.3 动态链表 15.3.1 动态链表的建立 15.3.2 解决输入字符造成死循环的问题 ...

Global site tag (gtag.js) - Google Analytics