126.友元函数在类内部声明还是内外?
126.友元函数在类内部声明还是内外?
友元函数不一定要在类内声明,普通的友元函数可以在类外声明,也可以在类内声明。
只有友元工厂才必须用到类内声明友元函数。
友元函数可以在类的内部声明,也可以在类的外部声明。
1.如果友元函数是在类的内部声明的,那么它可以直接访问类的私有成员和保护成员,即使这些成员在类的外部是不可见的。这种声明方式可以使代码更加简洁,因为友元函数的声明和定义都放在了类的定义中。然而,如果友元函数在类的内部声明,它的可见性只限于该类及其派生类,无法在其他地方直接使用。
2.如果友元函数是在类的外部声明的,那么它仍然可以访问类的私有成员和保护成员,但是需要使用类名来限定友元函数的可见性。这种方式可以使代码更加清晰,因为友元函数的声明和定义可以单独放在一个头文件中,而不需要与类的定义混合在一起。此外,如果友元函数需要在其他地方直接使用,这种方式也更加方便。
无论是在类的内部还是外部声明友元函数,都需要在类的定义中声明该函数是类的友元函数。可以使用friend
关键字来声明友元函数,例如:
友元函数可以在类定义的任何地方声明(除了在函数体内),不受类访问限定符限制(不是类的成员函数)
//- 友元函数为另一个类中的成员函数的实现代码
#include <iostream>
using namespace std;
class person; //类的前置声明
class animal
{
public:
void eat(person& pn); //这里只用到一个person类的引用,不涉及person里面的具体细节,所以能编译通过
};
class person
{
public:
int age;
person(){};
person(int age,int height,string name);
friend void animal::eat(person& pn);
protected:
int height;
private:
string name;
};
//构造函数
person::person(int age,int height,string name)
{
this->age = age;
this->height = height;
this->name = name;
}
void animal::eat(person& pn)
{
cout << "animal eat a person nameed" << pn.name << endl;
cout << "animal eat a person age = " << pn.age << endl;
cout << "animal eat a person height = " << pn.height << endl;
}
int main(int argc, char const *argv[])
{
person p1(10,155,"jime");
animal a1;
a1.eat(p1);
return 0;
}
参考:wangchuang2022
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)