gpt4 book ai didi

c++ - 将非成员函数放在类中是一种好习惯吗?

转载 作者:太空狗 更新时间:2023-10-29 19:52:23 24 4
gpt4 key购买 nike

我正在阅读这样的代码:

class Member
{
public:
friend std::istream& operator>>(std::istream& in, Member& m)
{
in >> m.name >> m.bYear >> m.bMonth;
return in;
}

friend std::ostream& operator<<(std::ostream& out,const Member& m)
{
out << m.name << " " << m.bYear << "." << m.bMonth;
return out;
}

private:
std::string name;
int year;
int month;
};

我以前从未见过这种方式。使用 friend 在类主体中定义非成员函数是一种好习惯吗?有什么好处和坏处吗?

最佳答案

Is it a good practice to define nonmember function inside a class body with friend?

无关紧要的做法,我会说。

Any pros and cons?

优点

  • 运算符可以在类的作用域中引用类成员(嵌套类、typedef、枚举、常量、静态函数等),而无需显式地为它们加上类名前缀

  • 隐式使用流功能很方便 inline - 没有一个定义规则的麻烦

  • 友元意味着您可以方便地访问所有非公开成员

  • 学习类源代码的人更容易注意到流媒体功能

  • 正如 Mike Seymour 评论的那样,如果类是模板,那么定义 friend 可以让您省略 template < ... >运算符的方面,并将实例参数简单地称为 const Member&而不是 const Member< ... >& .

缺点

  • 您可能想要一个外联函数定义,这样您可以稍后修改实现并且只需要重新链接(而不是重新编译)客户端代码

  • 您授予的友元在功能上可能不是必需的,这会降低封装性并因此降低可维护性

  • 寻找非成员(member)流媒体运营商的人可能不会考虑查看类(class)代码

  • 您可能会争辩说它“弄乱”了类定义源代码,使得更难吸收实际类成员的全部

像往常一样,接口(interface)和实现的干净分离的好处——无论是管理物理依赖性(需要重新编译而不是仅仅重新链接)还是人类可读性——对于由不同的高级库使用的低级库和应用程序,并且对于本地实现的“私有(private)”支持要低得多(例如 .cpp 文件中的匿名命名空间中的类,仅由该单个翻译单元使用,或者 - 甚至更多 - private 嵌套类) .

关于c++ - 将非成员函数放在类中是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26523892/

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