gpt4 book ai didi

c++ - const 重载的 operator[] 函数及其调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:20 26 4
gpt4 key购买 nike

我在类 array 中定义了两个版本的重载 operator[] 函数。 ptr 是指向 array 对象第一个元素的指针。

int& array::operator[] (int sub) {  
return ptr[sub];
}

int array::operator[] (int sub) const { 
return ptr[sub];
}

现在,如果我定义一个 const 对象 integer1 只能调用第二个函数......但是如果我创建一个非 const 对象然后调用如下:

cout << "3rd value is" << integer1[2];

这里调用了哪个函数?

最佳答案

在您的第二个示例中,将调用非常量版本,因为不需要转换,不需要转换的调用比需要转换的调用更匹配。

然而,最终,您在这里遇到了一个基本问题:您真正想要的是根据您是将对象用作右值还是左值以及 const 而改变的行为。并没有真正做到这一点。为了使其正常工作,您通常需要返回一个代理对象,并重载 operator=operator T对于代理对象:

template <class T>
class myarray {
T *ptr;

class proxy {
T &val;
proxy &operator=(proxy const &p); // assignment not allowed.
public:
proxy(T &t) : val(t) {}
operator T() const { return val; }
proxy &operator=(T const&t) { val = t; return *this; }
};

proxy const operator[](int sub) const { return proxy(ptr[sub]); }
proxy operator[](int sub) { return proxy(ptr[sub]); }
// obviously other stuff like ctors needed.
};

现在我们得到理智的行为——当/如果我们的 array<int> (或任何类型)是常量,我们的 operator[] const将被使用,它会给出 const proxy .由于它的赋值运算符不是常量,因此尝试使用它们将失败(无法编译)。

OTOH,如果原来array<int>不是 const,我们将得到一个非常量代理,在这种情况下我们可以同时使用 operator Toperator= ,并且能够读取和写入 array<int> 中的值.

关于c++ - const 重载的 operator[] 函数及其调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5762042/

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