风羽.Song 发表于 2019-8-18 16:55:55

关于C++字符的重载!c++新手求助!

在complex类里面,关于“+”字符的重载,用成员函数重载和用友元函数重载的区别。写在如下标红的三处的区别!!谢谢
例如:
#ifndef PCH_H
#define PCH_H
#include <iostream>

class Complex
{
public:
        Complex(double r = 0, double i = 0) : r(r), i(i)
        {
        }
        double real()const
        {
                return r;
        }
        double imag()const
        {
                return i;
        }
        Complex operator+ (const Complex& c1);
        Complex& operator+= (const Complex& c1);
        friend Complex operator* (const Complex&c1, const Complex& c2);
        friend Complex operator+ (const Complex& c1, const Complex& c2);

private:
        double r, i;


        friend std::ostream& operator << (std::ostream& os, const Complex& c2);

};
Complex operator+ (const Complex& c1, const Complex& c2);
Complex operator+ (const double c1, const Complex& c2);
Complex operator+ (const Complex& c1, const double c2);

#endif //PCH_H

Richard149 发表于 2019-8-18 16:55:56

你好:成员函数:优先选用成员函数,但是部分运算符不可以用成员函数进行重载,比如<< 和 >>只能用友元   函数进行重载。

友元函数:可以重载任意运算符,但是在泛型编程中会造成 友元函数滥用的现象。

总结:除了不能用成员函数进行重载的运算符外,均应用成员函数进行重载。

Python.爱好者 发表于 2019-8-18 17:37:57

(1)类方法声明
(2)友元函数声明
(3)不知道
(1)与(2)的区别有两点:
Ⅰ(1)要在class内定义(或在外部使用Complex::前缀),而(2)只能在外部定义且不能使用前缀(且删去friend字样)
Ⅱ(2)不能用于定义.以及->方法。

风羽.Song 发表于 2019-8-18 20:11:09

Python.爱好者 发表于 2019-8-18 17:37
(1)类方法声明
(2)友元函数声明
(3)不知道


先谢谢了,你说的这些都对,但是没有说明这几种写法在函数运行时有什么优缺点?在什么情况下该用哪种?还有第三种写法也可以,我试过了。

风羽.Song 发表于 2019-8-18 20:13:08

自顶,有没有大牛帮忙解答!谢谢!!

Python.爱好者 发表于 2019-8-19 07:52:26

风羽.Song 发表于 2019-8-18 20:11
先谢谢了,你说的这些都对,但是没有说明这几种写法在函数运行时有什么优缺点?在什么情况下该用哪种?还 ...

大概就是看情况来决定吧。
对了,(3)是函数的外部声明,也可以使用。
之前看错了,以为(3)是在类内部声明的
友元函数的定义中不能出现this,只能出现两个操作数。类方法定义中只能有一个操作数,第一个包含在this中
对了,纠正一下我的答案,以下运算符不能被重载(三者均不能):
.
::
.*
?:
sizeof
应该友元函数不能重载的是[]吧(不清楚)

Richard149 发表于 2019-8-20 21:49:22

风羽.Song 发表于 2019-8-18 20:13
自顶,有没有大牛帮忙解答!谢谢!!

我在下面回复了 ,,你可以看一下,看看能不能帮助你,

pl_014 发表于 2019-8-24 19:50:09

风羽.Song 发表于 2019-8-18 20:11
先谢谢了,你说的这些都对,但是没有说明这几种写法在函数运行时有什么优缺点?在什么情况下该用哪种?还 ...

运算符的重载在本质上就是成员函数,编译器一般也是这么实现的,在分析、使用的时候可当作成员函数来使用。
然后你说的区别是指运算符重载的成员函数和运算符重载的全局函数是吧,这两种写法的区别就是运算符重载的成员函数的指定位置必须是类本身或类本身的引用,但全局函数没有这个限制,但因为全局函数不属于类,所以可能需要声明友元。
一般来说,如果是自定义的类的运算符重载使用前者,如果是使用外部类则使用全局函数。

最后,你醒目标记的第二处依赖第三处,也就是说,第三处的这个函数存在,第二处的友元声明才会有意义。

pl_014 发表于 2019-8-24 20:26:06

Richard149 发表于 2019-8-20 21:46
你好:成员函数:优先选用成员函数,但是部分运算符不可以用成员函数进行重载,比如>只能用友元   函数进 ...

没这个说法https://doc.qt.io/qt-5/qdebug.html https://doc.qt.io/qt-5/qdatastream.html

风羽.Song 发表于 2019-8-28 19:27:14

Richard149 发表于 2019-8-20 21:46
你好:成员函数:优先选用成员函数,但是部分运算符不可以用成员函数进行重载,比如>只能用友元   函数进 ...

非常感谢!

风羽.Song 发表于 2019-8-28 21:28:17

pl_014 发表于 2019-8-24 19:50
运算符的重载在本质上就是成员函数,编译器一般也是这么实现的,在分析、使用的时候可当作成员函数来使用 ...

您好,谢谢回复!但是醒目标记的第三处,不依赖第二处。这里的第三处是类外的一个函数声明,它没有调用类里面的protected和private,所以是不是友元函数都不影响。
页: [1]
查看完整版本: 关于C++字符的重载!c++新手求助!