当结构在C++中也被引用时,它是否可以返回其成员之一?

Is it possible for a struct to return one of its members when it is referred too in C++?

本文关键字:返回 是否 成员 C++ 结构 引用      更新时间:2023-10-16

很抱歉这个问题很尴尬。

我想知道 C++ 中的结构是否可以在调用它本身时为其成员之一提供:

像这样:

struct fooStruct
{
int a;
int b;
}
//some stuff
fooStruct bar = {1, 2}
cout << bar << endl //prints 1 or a
cout << bar.b << endl //prints 2

我希望这能更清楚,谢谢你的回答!

我将首先解开你的一些术语,使问题不那么模棱两可。如果这些要点中的任何一点不匹配,则这部分答案将不适用。

  • "给它的一个成员":你希望能够命名对象bar,但结果更多的是关于对象的成员a

  • "当它
  • 本身被调用时":当它的名字被传递给流时(它不是一个函数!

  • "当它也被提及时":如上所述(在一个特定的场景/上下文中指它(

为此,您重载了operator<<.这是一种告诉计算机在使用流和类型为bar的对象调用<<时要发生什么的方法。该运算符的实现可以执行您喜欢的任何操作,包括流式传输成员变量。

它可能看起来像这样:

std::ostream& operator<<(std::ostream& os, const fooStruct& bar)
{
os << bar.a;
return os;
}

当此运算符重载存在且在范围内时,std::cout << bar << std::endl;将执行您要求的操作。

当它没有或不是时,该行将不会编译,因为计算机没有指令可以知道序列化bar的含义。

从此类运算符返回os引用是约定俗成的,并且允许链接。您可以在C++书中阅读更多相关信息。


相反,如果你想允许任何fooStruct被视为int,并且为了使该int具有其成员a的值,你可以创建一个隐式转换:

struct fooStruct
{
int a;
int b;
operator int() { return a; }
}

但是,编译器在任何时候可以进行的隐式转换次数都有限制(这可能有点痛苦(,并且隐式转换可能会导致类用户不希望的行为。一般来说,你应该避免这种情况,而只是写bar.a。它更清楚了。