运算符重载函数作为朋友?
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】:
你不将成员函数声明为friend
,friend
是为了让非成员函数访问内部,operator+
的一个操作数重载是成员函数。
无论如何,如果你正确地实现了二元运算符,你根本不需要给出友谊。将+=
实现为成员函数(不需要friend
,一个类总是与自己“朋友”),然后根据+=
实现一个非成员+
运算符,它使用+=
' s 访问内部,以避免整个友谊问题。
重载can be found here 的基本规则应该会有很大帮助。
【讨论】:
等等....为什么我的程序可以访问other
的内部?在 Java 中,情况并非如此。这里发生了什么?在我的operator+
中,我可以访问this
和other
的私人成员data
。为什么?
哦,所以如果你有class A
和A
中的任何函数,它接受A
类型的参数,它将拥有对该变量的私有访问权限?
@Hatefiend:Java gives you access too。 private
的意思是“只有这个类可以访问”,所以任何SecretInteger
都可以访问任何Secretinteger
的private
s,它自己或不同的实例。 private
仅用于接口目的,它不是一种安全功能,可将实例相互防火墙。以上是关于运算符重载函数作为朋友?的主要内容,如果未能解决你的问题,请参考以下文章