`
shake863
  • 浏览: 661181 次
  • 性别: 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++ 操作符重载

    4. **重载的语法**:成员函数重载操作符通常使用"operator关键字+操作符"的方式定义,例如`Complex Complex::operator+(const Complex& other) const;`。非成员函数则直接使用操作符,如`Complex operator+(const ...

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

    在C++编程语言中,重载运算符和友元函数是两个重要的概念,它们扩展了C++的灵活性和表达能力。下面将详细讲解这两个主题及其在实际编程中的应用。 首先,我们来探讨重载运算符。重载运算符是指在同一个作用域内为一...

    实现操作符重载 实现操作符重载

    正确、合理地重载操作符可以使类的行为更符合用户的直觉,提高代码的优雅度。但在设计和实现时,需要注意重载的合理性和效率,避免引入不必要的复杂性。理解并熟练掌握操作符重载,对于提升C++编程水平至关重要。

    C++操作符重载专题

    2. **作为成员函数:**当操作符重载函数作为类的成员函数时,它会隐式地接收当前对象作为第一个参数(通过`this`指针),因此其参数数量通常比作为友元或非成员函数时少一个。 ```cpp class MyClass { public: ...

    VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法.pdf

    问题的核心在于,VC6.0的编译器可能存在与标准C++不完全兼容的情况,特别是对于某些重载操作符的处理。例如,上述示例中,`和`&gt;&gt;`这两个I/O流操作符被重载,并尝试作为友元函数来访问类`Sample`的私有成员`x`。在Gnu...

    c++操作符重载

    操作符重载是C++允许程序员为自定义类型(如类或结构体)重新定义内置操作符的行为的过程。这意味着你可以使自定义类型像内置类型一样使用标准的数学或逻辑操作符。例如,你可以定义一个类`Complex`,并使其能够通过...

    C++ 中重载 + 操作符的正确方法

    在C++编程中,重载操作符是一项非常实用且强大的功能,能够帮助程序员以自然的方式处理自定义数据类型。对于像`+`这样的操作符而言,正确地进行重载尤为重要,因为它涉及到诸如字符串连接、数值相加等常见操作。本文...

    VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法.docx

    然而,在VC6.0这个较旧的Visual C++版本中,有时会出现重载操作符的友元函数无法访问类私有成员的问题。这是因为编译器可能存在一些不兼容C++标准的特性。 在给出的示例中,我们看到两个重载的I/O流操作符`和`&gt;&gt;`被...

    C++操作符重载

    在C++编程语言中,操作符重载是一种特殊的功能,允许程序员为已有的运算符赋予新的含义,以便在用户自定义的数据类型上使用。这使得我们可以以自然且直观的方式处理对象,增强了代码的可读性。操作符重载并不创建新...

    类应用举例 操作符重载

    操作符重载是面向对象编程中的一个重要概念,它允许程序员为类定义特定的操作符的行为,使得这些操作符能够用于类的对象上。 描述中首先对“类”进行了定义,类可以理解为一系列具有相同属性和行为的数据集合。类在...

    C++友元函数及友元类全总结

    - **运算符重载**:在实现某些特定运算符重载时,如重载`+`、`-`等操作符时,需要访问操作数的私有成员,这时可以使用友元函数。 - **类间数据共享**:当两个类需要共享数据时,可以通过定义友元函数来实现对私有...

    C++ Primer 第十四章 重载操作符与转换 思维导图笔记

    在C++编程语言中,重载操作符与转换是两个重要的概念,它们允许程序员自定义基本操作符的行为,以及在不同类型之间进行灵活的转换。在第十四章《C++ Primer》中,作者深入探讨了这些主题,以帮助读者更好地理解和...

    分数类中的操作符重载

    这可以通过在分数类中添加一个构造函数,接受一个整数并将其作为分子,分母设为1,或者通过重载操作符使整数可以隐式转换为分数对象来实现。 在`fraction`文件中,可能包含了这个分数类的实现细节,包括类定义、...

    C++操作符重载专题 超高清 超详细

    操作符重载是C++编程语言中一种强大的特性,它允许开发者为自定义类型赋予常用操作符如加、减、乘、除等新的含义。通过操作符重载,我们可以像操作基本数据类型一样操作自定义的对象,这不仅提高了代码的可读性和...

    C++操作符重载手册

    7. **搜索顺序** 重载操作符的查找遵循特定的范围,从类成员到全局函数,再到所在名字空间的函数,然后是右操作数所在名字空间的函数,最后是友元函数。 8. **行为一致性** 重载操作符应尽可能模仿其在内置类型上的...

    面向对象程序设计C++:第6章 操作符重载.ppt

    在C++中,通过重载操作符,我们可以为自定义类型赋予与内置类型相似的操作方式,使得代码更加直观。本章主要讲解了C++中的操作符重载机制及其应用。 操作符重载的基本原则是将操作符的功能实现转化为函数代码的实现...

    C++常用运算符重载简介

    为什么要重载操作符? -------------------- 在C++中,有许多内置的数据类型,包括int、char、double等,每一种类型都有许多运算符,例如加+、减-、乘*、除/等。当用户定义了类的对象时,两个对象之间是不能进行...

    39114_20170620200252_C++操作符重载_

    在C++编程语言中,操作符重载是一种特殊的功能,允许我们为自定义类型赋予与内置类型(如整型或浮点型)相同的操作符含义。通过操作符重载,我们可以使用户定义的类更加直观和易用,因为它能够遵循程序员熟悉的运算...

    c++中运算符重载精讲

    当运算符重载函数作为友元函数时,需要在类外部声明和定义该函数,并使用友元关键字来指定该函数为类的友元。例如,想要重载加法运算符,就需要在类外部声明一个名为operator+的函数,并定义该函数的实现细节。 三...

Global site tag (gtag.js) - Google Analytics