题目分别收录于 牛客网 在线编程-语法篇-C++入门-04面向对象-CPP42 和 CPP63
友元
一个类中可以有公用成员(public)和私有成员(private)。在类内可以访问公用成员和私有成员,在类外只能访问公用成员,而不能访问私有成员。
友元比较特殊,当它与某些类建立了“朋友”关系,它可以访问与其有“朋友”关系的类中的私有成员。这种关系用关键字 friend 声明。
友元包括友元函数和友元类。
题目1
描述
在现有代码的基础上,使用友元全局函数,让程序能够正常运行。
输入描述:
无
输出描述:
输出年龄
现有代码:
#include <iostream> using namespace std; class Person { // write your code here...... public: Person(int age) { this->age = age; } private: int age; }; void showAge(Person& p) { cout << p.age << endl; } int main() { Person p(10); showAge(p); return 0; }
友元函数
在本类以外的其他地方定义的一个函数(可以不属于任何类的非成员函数,也可以是其他类的成员函数),并在类体中用 friend 声明。
本题中,showAge 函数即为不属于任何类的非成员函数,只需在 Person 类内, showAge 函数前面加上关键字 friend 即可。如果不是 Person 类的友元函数,是无法访问 Person 类的私有成员 age 的。
一个函数可以被多个类声明为“朋友”,这样就可以引用多个类的私有数据。
代码1
此题为入门题,仅需添加一行代码,声明 showAge 函数为 Person 类的友元函数即可。
#include <iostream> using namespace std; class Person { friend void showAge(Person&); public: Person(int age) { this->age = age; } private: int age; }; void showAge(Person& p) { cout << p.age << endl; } int main() { Person p(10); showAge(p); return 0; }
题目2
描述
现在有一个手机类phone与我的手机类myphone。
在现有代码的基础上,使用友元类,让程序能够正常运行。
输入描述:
输入一个整数,表示价格。
输出描述:
输出价格。
示例1
输入:
1000
输出:
1000
现有代码:
#include<bits/stdc++.h> using namespace std; class phone{ // write your code here...... private: int price; public: phone(int x){ price=x; } }; class myphone{ private: phone a; public: myphone(int x):a(x){ } int getprice(){ return a.price; } }; int main(){ int p; cin>>p; myphone a(p); cout<<a.getprice(); return 0; }
友元类
如果声明类B是类A的友元类,则友元B中的所有函数都是类A的友元函数,可以访问类A的所有成员。
在类A中声明类B为其友元类:
friend 类B
注意:
友元关系是单向的,如果类B是类A的友元类,则类B成员函数可以访问类A的所有成员,但类A成员函数不一定能访问类B的所有成员。
友元关系不能传递,如果类B是类A的友元类,类C是类B的友元类,不等于类C是类A的友元类。
代码2
此题为入门题,仅需添加一行代码,声明 myphone 类的 myphone 函数为 phone 类的友元函数即可。
#include<bits/stdc++.h> using namespace std; class phone{ friend class myphone; private: int price; public: phone(int x){ price=x; } }; class myphone{ private: phone a; public: myphone(int x):a(x){ } int getprice(){ return a.price; } }; int main(){ int p; cin>>p; myphone a(p); cout<<a.getprice(); return 0; }