• 猿创征文|【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
  • 相关阅读:
    【每日一题(并查集,字符串)--8.9】
    nvm 安装使用
    GPT-Chinese 复现
    JavaWeb—HTTP状态 405 - 方法不允许【BUG已解决】
    UE5数字孪生系列笔记(一)
    docker查看jvm内存占用
    【zookeeper】zk的ZAB原子广播协议
    SpringBoot 整合 H2 嵌入式关系型数据库
    TCP 通信并发服务器详解(附有案例代码)
    unity打AB包,AssetBundle预制体与图集(二)
  • 原文地址:https://blog.csdn.net/weixin_43470383/article/details/126691972