• 猿创征文|【C++之友元函数与友元类】输出年龄


    题目分别收录于 牛客网 在线编程-语法篇-C++入门-04面向对象-CPP42 和 CPP63
    在这里插入图片描述
    在这里插入图片描述

    友元

    一个类中可以有公用成员(public)和私有成员(private)。在类内可以访问公用成员和私有成员,在类外只能访问公用成员,而不能访问私有成员。

    友元比较特殊,当它与某些类建立了“朋友”关系,它可以访问与其有“朋友”关系的类中的私有成员。这种关系用关键字 friend 声明。

    友元包括友元函数友元类

    题目1

    描述

    在现有代码的基础上,使用友元全局函数,让程序能够正常运行。

    输入描述:

    输出描述:

    输出年龄

    现有代码:

    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    友元函数

    在本类以外的其他地方定义的一个函数(可以不属于任何类的非成员函数,也可以是其他类的成员函数),并在类体中用 friend 声明

    本题中,showAge 函数即为不属于任何类的非成员函数,只需在 Person 类内, showAge 函数前面加上关键字 friend 即可。如果不是 Person 类的友元函数,是无法访问 Person 类的私有成员 age 的。

    一个函数可以被多个类声明为“朋友”,这样就可以引用多个类的私有数据。

    代码1

    此题为入门题,仅需添加一行代码,声明 showAge 函数为 Person 类的友元函数即可。

    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    题目2

    描述

    现在有一个手机类phone与我的手机类myphone。
    在现有代码的基础上,使用友元类,让程序能够正常运行。

    输入描述:

    输入一个整数,表示价格。

    输出描述:

    输出价格。

    示例1

    输入:

    1000
    
    • 1

    输出:

    1000
    
    • 1

    现有代码:

    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    友元类

    如果声明类B是类A的友元类,则友元B中的所有函数都是类A的友元函数,可以访问类A的所有成员。

    在类A中声明类B为其友元类:

    friend 类B
    
    • 1

    注意:

    • 友元关系是单向的,如果类B是类A的友元类,则类B成员函数可以访问类A的所有成员,但类A成员函数不一定能访问类B的所有成员。
    • 友元关系不能传递,如果类B是类A的友元类,类C是类B的友元类,不等于类C是类A的友元类。

    代码2

    此题为入门题,仅需添加一行代码,声明 myphone 类的 myphone 函数为 phone 类的友元函数即可。

    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    【GlobalMapper精品教程】021:利用控制点校正栅格图像
    mongodb数据库操作
    UDP协议结构及其注意事项
    057_末晨曦Vue技术_处理边界情况之强制更新($forceUpdate)与通过 v-once 创建低开销的静态组件
    MAX6675应用注意事项
    LeetCode 周赛上分之旅 #40 结合特征压缩的数位 DP 问题
    vue双向绑定/小程序双向绑定?
    JavaWeb后端开发登录操作 登录功能 通用模板/SpringBoot整合
    练习八-利用有限状态机进行时序逻辑的设计
    微信小游戏是个人尝试做游戏最好的选择
  • 原文地址:https://blog.csdn.net/weixin_43470383/article/details/126691972