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唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...
随机推荐
- rpmnew和rpmsave怎么来的
RPM spec文件有个名为 %config 的宏,它可以标识配置文件,这样在升级时用户对配置文件做过的修改就不会丢失.没有它,用户千辛万苦修改过的配置文件会在升级过程中被覆盖. %config也可以 ...
- idea添加jar包
之前一直使用eclipse,现在使用idea,发现两者引用外部jar的时候不太一样,分享一下. 使用eclipse引用外部jar的时候,我们可以在工程下新建一个lib包来存放,然后add to bui ...
- Struts framework
Struts功能详解——ActionMapping对象 Struts旅程(一)Struts简介和原理 实例讲解DispatchAction和LookupDispatchAction DispatchA ...
- CSS基础教程:群组化选择器
常常我们的CSS 样式中会有好几个地方需要使用到相同的设定时,一个一个分开写会是一件满累人的工作,重覆性太高且显得冗长,更不好管理....在CSS 语法的基本设定中,就可以把这几个相同设定的选择器合并 ...
- 关于Python缩进,我们该了解哪些?
Python是一门独特的语言,它的代码块是通过缩进(Indentation)来标记的(大部分语言都是使用花括号作为代码块的标记),具有相同缩进的多行代码属于同一个代码块.如果代码莫名其妙的乱缩进,Py ...
- Mac上homebrew使用
一.官方网址 Homebrew 二.目录 安装 查看帮助信息 查看版本 更新Homebrew自己 安装软件包 查询可更新的包 更新包 (formula) 清理旧版本 锁定不想更新的包 卸载安装包 查看 ...
- iView3.x Anchor(锚点)组件 导航锚点
iView3.x Anchor(锚点)组件 导航锚点 iview 3.x框架中新添了一个Anchor(锚点组件),用这个组件去做页面的分类导航正好合适,但是苦于官方文档太过抽象研究了一整天,才勉强可以 ...
- <第一周> city中国城市聚类 testdata学生上网聚类 例子
中国城市聚类 # -*- coding: utf-8 -*- kmeans算法 """ Created on Thu May 18 22:55:45 2017 @auth ...
- Leetcode876.Middle of the Linked List链表的中间节点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4 ...
- Docker数据管理-数据卷 data volumes和数据卷容器data volumes containers的使用详解
此文来源于:https://yq.aliyun.com/ziliao/43471 参考原文件之外,做了些修改. Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录 ...