C++第三次作业:友元类
友元类
将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计成一个类外的普通函数还是一个成员函数都不是那么让人满意,那么该怎么处理这个问题呢?友元类的机制给我们提供了一种思路。
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
一旦将A类设置为了B的友元类,那么A的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
用法:通过<<friend>>构造性来实现。
下面是代码实例:
#include "pch.h"
#include <iostream> using namespace std; class Dog
{
public:
Dog(int newweight, int newage);
void Show();
friend class B; //友元类
private:
int weight;
int age;
}; Dog::Dog(int newweight, int newage)
{
weight = newweight;
age = newage;
} void Dog::Show()
{
cout << "汪汪"<<endl;
} class B
{
public:
void print(Dog &a)
{
cout << "weight=" << a.weight << " age=" << a.age <<endl;
}
private:
int number=; };
int main() //主函数测试
{
Dog Tom(,);
B Jack;
Jack.print(Tom);
}
测试结果如下:

测试结果表明Dog的友元B是可以去访问Dog的数据的,这样,就实现了数据的共享。
上面代码实现的是B访问Dog的数据,既然存在友元关系,那么,Dog能访问到B中的数据吗?我们修改代码如下图。
#include "pch.h"
#include <iostream>
using namespace std; class Dog
{
public: void Show(B &a);
friend class B;
private:
int weight;
int age;
}; void Dog::Show(B &a) //对B类中的数据进行访问
{
cout << a.number<<endl;
} class B
{
public:
private:
int number=;
};
int main()
{
Dog Tom;
B Jack;
Tom.Show(B);
}
如果能进行访问,那么打印的结果应该为“3”,但是编译器显示错误,无法运行,那么说明,当B是Dog的友元是,Dog无法访问到B中的数据,仅B可以访问Dog的数据。
通过实践以及对书的理解,我们最终可以得出:
1.友元关系是不能传递的。
2.友元关系是单向的
3.友元关系是不能被继承的。
C++第三次作业:友元类的更多相关文章
- c++第三次作业:类的友元
C++第三次作业:类的友元 1.友元的关系提供了不同类或对象的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通俗的说友元关系就是一个类主动声明其他函数是他的朋友,可以使其获得特殊访问权利 ...
- 第三次作业(ABC类代码优化及感悟)
这次作业与林杰同学合作完成,不重复发布了. 可以直接去林杰同学的博客看.http://www.cnblogs.com/linlinlin/p/4836707.html
- 面向对象OO第一单元三次作业总结
(一)第一单元的作业围绕着多项式的求导,从简单到复杂,主要的要求是 作业一:只有两种格式的因子:带符号整数(+02)和幂函数(x^+02). 作业二:在作业一的基础上添加了:sin(x)和cos(x) ...
- 2019OO第三单元作业总结
OO第三单元的作业主题是JML规格化设计,作业以图及图的最短路径相关计算为载体,体现接口的规格化设计. ------------------------------------------------ ...
- OO前三次作业思考(第一次OO——Blog)
OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- C++(三十四) — 友元函数、友元类
友元是可以访问类的私有成员和保护成员的外部函数.由 friend 修饰,不是本类的成员函数,但是在它的函数体中可以通过对象名访问本类的私有和保护成员. 友元关系不可传递,且是单向的. 友 ...
- 第三次作业:caculator
第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...
- 第三次作业——《K米评测》
第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...
随机推荐
- PYTHON网络爬虫与信息提取[BeautifulSoup](单元四)
1 简介 from bs4 import BeautifulSoup soup=BeautifulSoup(<p>data</p>,'html.parser') 2 基本元素 ...
- Redhat/Fedora 网络接口的配置文件和网络接口专用配置工具
在Redhat/Fedora 中,与乙太网卡相关的配置文件位于 /etc/sysconfig/network-scripts目录中,比如 ifcfg-eth0.ifcfg-eth1 .... .... ...
- Redis 复制、Sentinel的搭建和原理说明(转)
Redis 复制.Sentinel的搭建和原理说明 转自:http://www.cnblogs.com/zhoujinyi/p/5570024.html. 背景: Redis-Sentinel是Re ...
- 微信小程序之组件的集合(一)
小程序中是很强调组件中开发的,我们看到的页面是由许多组件组成的,但是这些组件是如何组合在一起的呢?来学习一下! 一.组件中数据的获取 接着上一篇文章,继续来优化代码,如何把从服务器上获取的数据显示到 ...
- LUOGU P1512 伊甸园日历游戏
题目描述 Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来.然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到 ...
- 【JZOJ3636】【BOI2012】Mobile(mobile)
Mission 著名的手机网络运营商Totalphone 修建了若干基站收发台,以用于把信号网络覆盖一条新建的高速公路.因为Totalphone 的程序员总是很马虎的,所以,基站的传功功率不能独立设置 ...
- Android——<uses-sdk>
语法(SYNTAX): <uses-sdk android:minSdkVersion="integer" android:targetSdkVersion="in ...
- PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)
正则表达式由字符和操作符构成 . 表示任何单个字符 []字符集,对单个字符给出取值范围 [abc]或者关系 [a-z]表示 [^abc]表示非这里面的东西 非字符集 * 表示星号之前的字符出现0次或 ...
- 移动HTML5前端框架—MUI
前 言 JRedu 鉴于之前的很多前端框架(特别是响应式布局的框架),UI控件看起来太像网页,没有原生感觉,因此追求原生UI也是MUI的重要目标.MUI以iOS平台UI为基础,补充部分Andro ...
- 为什么学习React Native三点原因
React Native不到两岁,兼容Android平台刚刚1年.我学习React Native其实也就不到1年,不算长,也不算短. Paul Graham在文章中写过:大多数人真正注意到你的时候,不 ...