运算符重载函数作为朋友?

Posted

技术标签:

【中文标题】运算符重载函数作为朋友?【英文标题】:Operator overloaded functions as friend? 【发布时间】:2017-02-09 03:02:27 【问题描述】:

我有一个代表特殊数字的类。

class SecretInteger

private:
    unsigned int *data;
    size_t length;

public: 
    SecretInteger operator+(const SecretInteger other) const;

我不能让我的代码的任何其他部分访问data 变量。但是,我的operator+ 函数必须能够看到它。通常在这种情况下,我知道使用 friend 关键字是唯一的方法。但是当我写的时候:

friend SecretInteger operator+(const SecretInteger other);

它声称operator+ 不能被声明为朋友,即使我之前写过friend std::ostream& operator<<(std::ostream& stream, const SecretInteger val); 并且它工作正常。

我有哪些选择?如果我有一个像

这样的公共方法

const *unsigned int getData() const; 我认为即使那样它实际上并没有使变量返回const 对吗?我真的不希望有 getData() 方法,而只是将具有访问权限的函数声明为 friend

【问题讨论】:

您将operator+ 声明为成员函数,因此它可以访问data,不是吗? ~~它无法访问other的数据,这使我无法进行算术运算。~~ 旁注:即使您坚持使用成员函数进行重载,也没有理由按值接受参数。 const SecretInteger& other 肯定是你想要的。 @ShadowRanger 为什么让运算符重载成员函数是不好的?有什么选择?如果你的意思是建立一个朋友功能,它不允许我这样做。 SecretInteger 也是一个不可变的类,所以我认为按值传递是完全可以的,因为我不打算在任何时候对 other 进行任何更改。 @Hatefiend 不,可以。你试过了吗? 【参考方案1】:

你不将成员函数声明为friendfriend 是为了让非成员函数访问内部,operator+ 的一个操作数重载是成员函数。

无论如何,如果你正确地实现了二元运算符,你根本不需要给出友谊。将+=实现为成员函数(不需要friend,一个类总是与自己“朋友”),然后根据+=实现一个非成员+运算符,它使用+=' s 访问内部,以避免整个友谊问题。

重载can be found here 的基本规则应该会有很大帮助。

【讨论】:

等等....为什么我的程序可以访问other的内部?在 Java 中,情况并非如此。这里发生了什么?在我的operator+ 中,我可以访问thisother 的私人成员data。为什么? 哦,所以如果你有class AA 中的任何函数,它接受A 类型的参数,它将拥有对该变量的私有访问权限? @Hatefiend:Java gives you access too。 private 的意思是“只有这个类可以访问”,所以任何SecretInteger 都可以访问任何Secretintegerprivates,它自己或不同的实例。 private 仅用于接口目的,它不是一种安全功能,可将实例相互防火墙。

以上是关于运算符重载函数作为朋友?的主要内容,如果未能解决你的问题,请参考以下文章

C++运算符重载函数作为友元函数

小于运算符不能作为成员函数重载

重载运算符问题

重载运算符将函数指针作为参数,我如何检索函数指针的参数

运算符重载(作为普通函数)

运算符重载(作为成员函数)