gpt4 book ai didi

c++ - operator[] 在 C++ 中如何工作(重载用户定义的对象)?

转载 作者:行者123 更新时间:2023-11-30 01:51:02 27 4
gpt4 key购买 nike

我知道开发人员能够重载 operator[] 以根据操作符在哪一侧获取或设置某些内容。例如,您可以执行 obj[2] = test_obj;test_obj = obj[2]。但是我不明白第一个例子是如何工作的; operator[] 返回对堆上某物的引用,所以当 obj[2] = test_obj; 运行时,发生了什么?如果索引 2 已经有东西,它会被删除吗? 2处对象的析构函数首先被调用吗?由于这种类型的检查没有在 operator[] 的方法体中完成,这一切是如何完成的?

最佳答案

引用的工作方式与指针非常相似,但引用总是指向一些实际值。

enter image description here

所以当operator[]返回一个引用,然后分配给该引用,就是直接分配给该引用所指的值。在您的示例中,这将是位于索引 2 处的对象。请注意 Container::operator[] 的返回类型不是对 Container 的引用,但它通常是对包含的值的引用。

要给出详细的答案,这取决于 operator[] 的实际返回类型对于有问题的类型。如果返回类型是对基本类型的引用,那么它就像对基本类型的任何其他引用一样工作。没有涉及析构函数。分配直接发生在引用值中。例如:

int x = 5;
x = 6;

没有析构函数被调用。没有调用运算符(operator)。 x 包含的值被赋值运算符右侧的值替换。

类似地,如果涉及引用:

int x = 5;
int &r = x;
r = 6;

没有析构函数被调用。没有调用运算符(operator)。 r 的值点(在本例中为 x)被赋值运算符右侧的值替换。

类似地,如果涉及非原始类型,则 operator=对于给定的类型将被调用。

Foo x;
Foo y;
// Foo::operator=(const Foo &) is called on x with an argument referencing y
x = y;

都不是x也不y的析构函数必然会被调用。

与引用相同:

Foo x, y;
Foo &r = x;
// Foo::operator=(const Foo &) is called on x with an argument referencing y
r = y;

然而,operator[] 不需要返回引用;虽然,强烈鼓励这样做。

对于非引用或非原始类型的引用,operator=返回值的调用,因此赋值运算符的行为也很重要。

operator=的情况下左侧的析构函数未被调用,但赋值运算符本身负责任何清理。这就是为什么赋值运算符通常根据 copy-swap idiom 来实现的原因。 .

所以在 std::vector<int> 的情况下, std::vector<int>::operator[]返回 int & .分配发生在引用点所在的位置。

对于 std::vector<Foo> , std::vector<Foo>::operator[]返回 Foo &Foo::operator=(const Foo &)被调用。

但是就像我提到的,类可以从 operator[] 返回任意对象并且该对象的赋值运算符将被调用。这可用于通过另一个对象代理分配。您可能会在 Matrix 类中看到它,该类返回一个 Row 对象,该对象又可能实现 operator[] .同样,不一定推荐这种设计,但并非闻所未闻。在这些情况下,返回类型可能根本不是引用,而是实际值。但是,它仍然以相同的方式 工作。 Row::operator=Proxy::operator=负责分配和清除任何必要的资源。这就是为什么 Rule of Three非常重要。

关于c++ - operator[] 在 C++ 中如何工作(重载用户定义的对象)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26599066/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com