gpt4 book ai didi

c++ - 重载成员访问运算符 ->, .*

转载 作者:IT老高 更新时间:2023-10-28 11:51:49 32 4
gpt4 key购买 nike

我了解大多数运算符重载,但成员访问运算符 ->.*->* 等除外。

具体来说,传递给这些运算符函数的是什么,应该返回什么?

运算符函数(例如 operator->(...) )如何知道所引用的成员是什么?它可以知道吗?它甚至需要知道吗?

最后,是否有任何 const 需要考虑的因素?例如,当重载像 operator[] 这样的东西时,通常你需要一个 const 和 non-const 版本。成员访问运算符是否需要 const 和非 const 版本?

最佳答案

->

这是唯一一个非常棘手的问题。它必须是一个非静态成员函数,并且不带任何参数。返回值用于执行成员查找。

如果返回值是另一个类类型的对象,而不是指针,那么后续的成员查找也由 operator-> 函数处理。这称为“向下钻取行为”。该语言将 operator-> 调用链接在一起,直到最后一个返回指针。

struct client
{ int a; };

struct proxy {
client *target;
client *operator->() const
{ return target; }
};

struct proxy2 {
proxy *target;
proxy &operator->() const
{ return * target; }
};

void f() {
client x = { 3 };
proxy y = { & x };
proxy2 z = { & y };

std::cout << x.a << y->a << z->a; // print "333"
}

->*

这个比较棘手,因为它没有什么特别之处。 非重载版本需要一个指向左侧类类型指针的对象和一个指向右侧成员类型指针的对象。但是当你重载它时,你可以接受任何你喜欢的参数并返回任何你想要的东西。它甚至不必是非静态成员。

换句话说,这只是一个普通的二元运算符,如+-/。另见:Are free operator->* overloads evil?

.*.

这些不能重载。当左侧是类类型时,已经有一个内置的含义。或许能够为左侧的指针定义它们有点意义,但语言设计委员会认为这会更令人困惑而不是有用。

重载->->*..*只能填充一个表达式将是未定义的,它永远不会改变一个在没有重载的情况下有效的表达式的含义。

关于c++ - 重载成员访问运算符 ->, .*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777845/

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