下标分配重载

时间:2016-03-25 22:51:05

标签: c++ c++11

我在 C ++ 中创建了一个class Poly,其中包含如下定义的私有成员。

private:
 std::size_t sz;
 std::vector  <T>  elem;

重载赋值运算符和/或下标运算符以将值赋给容器元素的标准方法是什么?例如:

  Poly < double > obj{1, 2, 3};
  obj[1] = 1;

应将值1分配给第二个元素。

实现这一目标的一种方法可能是:

 T & operator[](int i) {
   if(i < 0 || i >= sz)
     throw std::out_of_range{"Poly::operator[]"};
   return elem[i];
 }

但是,它通过引用返回元素,并且赋值在类外部完成,而不是由成员函数完成。它是否违反了抽象的原则,因为私有成员被访问到对象之外?此外,人们无法确保检查不变量,即,我们说我们对可以分配的值有限制。

我宁愿选择成员函数,例如:

void assign_val(T val, int idx)
{
//Check if the conditions hold...
//...
elem[idx]=val;
}

下标阅读:

  const T & operator[](int i) const{
   if(i < 0 || i >= sz)
     throw std::out_of_range{"Poly::operator[]"};
   return elem[i];
 }

使用运算符重载可以获得这种效果吗?

1 个答案:

答案 0 :(得分:1)

不,你无法做到这一点。通过使用运算符,如果要为其赋值,则必须公开对变量的引用。此过程中没有涉及函数调用,它通过在内存中提供实际存储值的位置来保存。