C++:友元

友元(friend)是 C++ 中的一个关键字,用于建立类之间的友好关系;通过友元关系,一个类可以授权其他类或函数访问其私有成员或受保护成员,从而突破了 C++ 中的封装性;友元可以是类或函数,可以出现在类的声明中,也可以出现在类的外部,在声明中,友元关键字表明了某个函数或类是另一个类的友元,从而被授权访问该类的私有或受保护成员。

友元访问权限

友元关系为双向授权,即如果类 A 是类 B 的友元,但是类 B 不一定是类 A 的友元。
友元关系不具有传递性,即如果类 A 是类 B 的友元,而类 B 又是类 C 的友元,类 C 并不会自动成为类 A 的友元。

友元函数

友元函数是一个不属于任何类的普通函数,但被授权访问一个或多个类的私有或受保护成员。通过友元函数,可以实现对类的封装性的一定程度的突破,允许外部函数直接访问类的私有成员,以执行特定的操作。

class FriendTest
{
public:
    //声明友元函数
    friend void getPriNum(FriendTest &obj);
    
private:
    int nPriNum = 200;
};
​
//定义友元函数
void getPriNum(FriendTest &obj)
{
    std::cout << "private number:" << obj.nPriNum << std::endl;
}
​
int main() {
    FriendTest fritTestObj;
    //调用友元函数
    getPriNum(fritTestObj);
​
    system("pause");
    return 0;
}

在这个例子中,FriendTest 类中有一个私有成员 nPriNum,而 getPriNum() 函数被声明为 FriendTest 类的友元函数。这意味着 getPriNum 函数可以直接访问 FriendTest 对象的私有成员 nPriNum

main 函数中,我们创建了一个 FriendTest 对象 fritTestObj,然后调用了友元函数 getPriNum(),从而输出了 nPriNum 的值。

友元类

友元类是指一个类可以访问另一个类的私有或受保护成员。通过友元类,一个类可以授权另一个类访问自己的私有或受保护成员,从而实现了类之间的更紧密的合作关系。

class FriendB;
​
class FriendTest
{
private:
    int nPriNum = 200;
    //友元类声明
    friend class FriendB;
};
​
class FriendB {
public:
    void getFriendNumber(FriendTest &obj) {
        std::cout << "FriendPrivateNumber:"<< obj.nPriNum << std::endl;
    };
};
​
int main() {
    FriendTest friendObj;
    //getPriNum(friendObj);
​
    FriendB friendBobj;
    friendBobj.getFriendNumber(friendObj);
    system("pause");
    return 0;
}

在这个例子中,FriendTest 是一个包含私有成员 nPriNum 的类。然后,FriendB 类被声明为 FriendTest 的友元类,这意味着 FriendB 类可以访问 FriendTest 类的私有成员。在 FriendB 类的 getFriendNumber 成员函数中,我们可以直接访问 FriendTest 类的私有成员 nPriNum。在 main 函数中,我们创建了一个 FriendTest 对象 objA 和一个 FriendB 对象 friendBobj,然后通过 friendBobj 访问并打印了 FriendTest 的私有成员变量 nPriNum

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,我们先定义一个Student类和一个Score类。其中,Student类包含学号和姓名两个成员变量,Score类包含高等数学和英语两个成员变量。代码如下: ```c++ class Score { private: int math; int english; public: Score(int m, int e) { math = m; english = e; } friend class Student; friend void printScore(Student s); }; class Student { private: int id; string name; Score score; public: Student(int i, string n, int m, int e) : id(i), name(n), score(m, e) {} friend void printScore(Student s); friend void printScore2(Student s); friend class Score; }; ``` 接下来,我们需要输出一个学生的成绩单,包括学号、姓名、高等数学、英语成绩。我们可以通过以下三种方法实现: 方法1:非成员函数作为友元函数 ```c++ void printScore(Student s) { cout << "学号:" << s.id << endl; cout << "姓名:" << s.name << endl; cout << "高等数学成绩:" << s.score.math << endl; cout << "英语成绩:" << s.score.english << endl; } ``` 方法2:成员函数作为友元函数 ```c++ void Student::printScore2() { cout << "学号:" << id << endl; cout << "姓名:" << name << endl; cout << "高等数学成绩:" << score.math << endl; cout << "英语成绩:" << score.english << endl; } ``` 方法3:友元类 ```c++ void Score::printScore(Student s) { cout << "学号:" << s.id << endl; cout << "姓名:" << s.name << endl; cout << "高等数学成绩:" << math << endl; cout << "英语成绩:" << english << endl; } ``` 最后,我们可以创建一个学生对象,并调用以上三个方法来输出他的成绩单: ```c++ int main() { Student s(1001, "Tom", 90, 80); printScore(s); // 方法1 s.printScore2(); // 方法2 Score::printScore(s); // 方法3 return 0; } ``` 输出结果如下: ``` 学号:1001 姓名:Tom 高等数学成绩:90 英语成绩:80 学号:1001 姓名:Tom 高等数学成绩:90 英语成绩:80 学号:1001 姓名:Tom 高等数学成绩:90 英语成绩:80 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值