gpt4 book ai didi

c++ - 结构体中的友元函数有什么用?

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:13 25 4
gpt4 key购买 nike

我正在使用以下语法在结构中重载插入运算符 (<<):

struct Address{
string street;
string cross;
int suite;

friend ostream &operator <<(ostream &oss, const Address &other){
oss<<"street: "<<other.street<<"cross: "<<other.cross<<"suite: "<<other.suite;
return oss;
}
};

我看到,只有当我将函数声明为结构“地址”的友元时,我的代码才能编译。根据我的理解,当需要访问类的私有(private)成员时,友元函数很有用。但是,由于在结构中所有成员都是公共(public)的,因此不需要将“<<”运算符声明为友元。

谁能澄清在这里将“<<”运算符声明为结构“地址”的友元的必要性吗?

最佳答案

事实上,该运算符可以在没有 friend 的命名空间范围内定义.

您“不需要”将其设为 friend在这种情况下,正是出于您给出的原因,所以不清楚您是从哪里听说的!

struct Address
{
string street;
string cross;
int suite;
};

inline ostream& operator<<(ostream& oss, const Address& other)
{
oss << "street: " << other.street << "cross: " << other.cross << "suite: " << other.suite;
return oss;
}

(我把它设为 inline,假设您将整个定义保留在 header 中,但实际上我可能会在 header 中声明它,然后在其他地方定义它。)

但是用 struct 定义的类仍然只是一个类,仍然可以包含 private成员(member)就好了。如果你有一个这样做,你将再次需要一个 friend .

有些人可能会选择总是制作friend函数的一致性,因此 operator<< 的定义当您阅读它时,它看起来像是在类里面。或者,可能有一些神秘的查找约束使这很方便(因为以这种方式定义的 friend 函数只能由 ADL 找到),尽管我想不出有什么。

关于c++ - 结构体中的友元函数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54197607/

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