我在 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];
}
使用运算符重载可以获得这种效果吗?
答案 0 :(得分:1)
不,你无法做到这一点。通过使用运算符,如果要为其赋值,则必须公开对变量的引用。此过程中没有涉及函数调用,它通过在内存中提供实际存储值的位置来保存。