当前位置: 首页 > news >正文

猿创征文|【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;
}

最后建议大家学习编程的时候多刷题练习,这里推荐牛客网👍,不仅集成了丰富的题库可供刷题,还有学习资源库交流讨论区面试经验分享实习校招社招内推消息等等。
👉传送门:牛客网

刚入门可选择刷在线编程的题库🚩
熟悉之后可以尝试专项练习🚩

相关文章:

  • 猿创征文 |【C++】面向对象之微观部分——类的组成(上)
  • 基于springboot人事管理系统设计与实现
  • 多端统一开发解决方案---Taro
  • 分支合并到b和b合并到a有区别吗
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • jQuery基础
  • Stream API
  • Iceberg源码学习:flink读iceberg流程一
  • C++----IO流(参考C++ primer)
  • 利用内网穿透实现无固定IP调试支付回调
  • AI/DM相关conference ddl(更新中)
  • 大脑神经网络记忆原理图,记忆力机制的神经网络
  • MySQL安装与配置
  • tf.quantization
  • CleanMyMac X的免费版电脑系统瘦身工具
  • #Java异常处理
  • 10个最佳ES6特性 ES7与ES8的特性
  • Cookie 在前端中的实践
  • co模块的前端实现
  • Elasticsearch 参考指南(升级前重新索引)
  • ES10 特性的完整指南
  • js数组之filter
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • SQLServer之创建数据库快照
  • Vim 折腾记
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 理清楚Vue的结构
  • 聊聊hikari连接池的leakDetectionThreshold
  • 使用agvtool更改app version/build
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 用Canvas画一棵二叉树
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 阿里云服务器购买完整流程
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2)(2.10) LTM telemetry
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (zt)最盛行的警世狂言(爆笑)
  • (二)fiber的基本认识
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (力扣题库)跳跃游戏II(c++)
  • (学习日记)2024.01.09
  • (转载)Google Chrome调试JS
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net下的富文本编辑器FCKeditor的配置方法
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @hook扩展分析
  • @Validated和@Valid校验参数区别
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [Android Studio 权威教程]断点调试和高级调试
  • [C#7] 1.Tuples(元组)