【问题标题】: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 不,可以。你试过了吗?

标签: c++ c++11 friend


【解决方案1】:

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

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

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

【讨论】:

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