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

题目分别收录于 牛客网 在线编程-语法篇-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;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值