在类中重载运算符并返回对私有值的引用

时间:2018-03-19 12:41:31

标签: c++ class oop operator-overloading encapsulation

我正在使用的示例类:

class Vector
{
double val[3];
public:
double & operator [] (const unsigned int & index) {return this->val[index];};
}

然后我称之为:

Vector Example;
Example[0]=5;

使用像这样的运算符重载是正确的还是反对封装,我应该使用不同的东西?我在这里使用私有值的引用,我不确定这个实现。

2 个答案:

答案 0 :(得分:1)

到目前为止很好......你还需要一个可以从const对象中读取的东西。此外,没有理由通过const&amp;传递数组索引。另外,class Vector { double val[3]; public: double& operator [] (size_t index) {return val[index];}; const double& operator [] (size_t index) const {return val[index];}; }; 是隐含的。查看std::vector<>的成员函数签名。特别是operator[]。推送请求......

{{1}}

答案 1 :(得分:0)

这是你的抽象漏洞。它暴露了您可以读取或写入的实际double这一事实。

如果您以后想要将这些double更改为远程直接网络连接数据或存储在数据库中,您将被迫向界面添加重大更改。

话虽如此:

值得。您可能永远不会修改此类型来执行疯狂的操作,并且存在大量的编译,设计和运行时开销以实现无限制的抽象。

抽象和封装是有目的的并且有成本。

std::vector<bool>的{​​{1}}是您在引用返回类型不正常时可以执行的操作的示例。它用于返回子字节元素。请注意,它被广泛认为是设计错误。