运算符重载和设置值

Operator overloading and setting values

本文关键字:设置 重载 运算符      更新时间:2023-10-16

我创建了一个容器类,并将new关键字与指针结合使用,以了解它的工作原理以及如何使用它。

template<typename T>
class Container {
private:
T value;
public:
Container(T value) {
this->value = value;
}
Container() {
}
virtual ~Container() {
}
T getValue() {
return value;
}
void setValue(T value) {
this->value = value;
}
void operator[](T value) {
this->value = value;
}
};
int main() {
std::vector<Container<int>*> arr(10);
for (int i = 0; i < 10; i++) {
Container<int> *a = new Container<int>;
a->setValue(i);
//      a[i];
arr[i] = a;
std::cout << arr[i]->getValue() << std::endl;
delete a;
}
return 0;
}

[]运算符与setValue()具有相同的代码,但是如果我使用a->setValue(i),它只会打印从 0 到 9 的数字,并且使用a[i]它只打印一个随机数。为什么?

  1. 请参阅Sly_TheKing的答案(将索引运算符应用于指针(。
  2. 索引运算符旨在访问某个引用的特定偏移量处的值。它应该接受有符号或无符号整数值并返回一些特定的值。因此,要有效,运算符应如下所示:
T& operator[](size_t index)
{
return value;
}

实际上,由于您没有任何可以应用索引的内容(在您的情况下,唯一有效的索引是 0 – 或者从另一个角度来看,通过上述实现,任何索引都将返回相同的值,因此 &a[0] == &a[1] 将适用 - 这可能在语法上是正确的,但违反了索引运算符的语义...... 取消引用运算符会更合适:

T& operator*() { return value; }
T& operator->() { return value; }

可能,你也可以添加一个赋值运算符(将替换 setValue(:

Container& operator=(T const& value) { this->value = value; return *this; }

in line

Container<int> *a = new Container<int>;

您将a初始化为指针,因此使用此行

a[i];

您只需访问一些存储在a和偏移量i * sizeof(container<int>)中存储地址的内存

所以正确的用法是

std::vector<Container<int>*> arr(10);
for (int i = 0; i < 10; i++) {
Container<int> *a = new Container<int>;
(*a)[i];
arr[i] = a;
std::cout << arr[i]->getValue() << std::endl;
delete a;
}

使用(*a)[i];您可以访问您在课堂上编写operator[]