【问题标题】:Operator overloading = and []运算符重载 = 和 []
【发布时间】:2013-03-08 17:11:08
【问题描述】:

现在,我必须写

st[1];
st = 5;

我必须在我的代码中进行哪些更改才能做到这一点:

st[1] = 5;

#include <iostream>
using namespace std;
class A
{
public:
  A(){this->z = 0;}
  void operator = (int t)  { this->x[this->z] = t+10; }
  int& operator [] (int t) { this->z=t; return this->x[t]; }
private:
  int x[2];
  int z;
};
void main()
{
  A st;
  st[0]=9;
  cout<<st[0]; 
  system("pause");
}

UPD:现在我看到的是 9 而不是 19。

【问题讨论】:

  • 通过引用返回您的 int 以供 operator[]
  • operator[] 返回一个引用。请注意,这会破坏以这种方式完全暴露的成员所持有的值的封装。
  • 我不太确定你认为st[1]; 做了什么。如果这是您想要的,它肯定不会为下一个独立语句选择数组元素 1。 st[1]; st=5;st[1] = 5 是两个完全不同的东西。
  • 我需要使用 A 类,就像大小 = 2 的数组一样。这个数组的每个元素都是这个数字和一些 const 的总和 st[0]=5
  • 也许是这样,但我的意思是,st[1]; 如您上面的代码 sn-p 根本什么都不做(无论您是实现 operator[] 按值返回还是正确返回- 参考安迪徘徊的回答)。这是一个被忽略的值(或引用),就像(void)0;。它根本没有做任何事情。您确实必须在分配中一个声明才能实现您的意图。

标签: c++ oop syntax-error


【解决方案1】:

内置运算符= 需要一个左值 作为其左操作数。因此,为了使该语句能够编译:

st[1] = 5;

您需要将operator [] 的返回类型从int 更改为int&amp;

    int& operator [] (int t) { return this->x[t]; }
//  ^^^^

您还可以提供const 重载,如果调用operator [] 的对象是const,它将返回对const 的引用:

    int const& operator [] (int t) const { return this->x[t]; }
//  ^^^^^^^^^^                     ^^^^^

【讨论】:

  • const 成员函数返回const&amp; 是没有意义的,因为int 小到足以复制(尽管这应该被优化掉,内联并且实际上不相关)。
  • @AlexChamberlain:嗯,可能有一点。如果我有参考,我可以看到该值的变化。如果我返回一个值,那将是不可能的。这样,客户选择。这完全是关于值语义与引用语义。
  • 我从没想过要保留引用,尽管听起来它很容易悬空。
  • @AlexChamberlain:像所有观察指针/引用一样。取决于特定的设计,它可能有意义,也可能没有意义。
猜你喜欢
  • 2016-02-19
  • 2012-11-26
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多