126.友元函数在类内部声明还是内外?

发布时间 2023-08-02 21:41:33作者: CodeMagicianT

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