友元类

将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计成一个类外的普通函数还是一个成员函数都不是那么让人满意,那么该怎么处理这个问题呢?友元类的机制给我们提供了一种思路。

友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。

一旦将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++第三次作业:友元类的更多相关文章

  1. c++第三次作业:类的友元

    C++第三次作业:类的友元 1.友元的关系提供了不同类或对象的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通俗的说友元关系就是一个类主动声明其他函数是他的朋友,可以使其获得特殊访问权利 ...

  2. 第三次作业(ABC类代码优化及感悟)

    这次作业与林杰同学合作完成,不重复发布了. 可以直接去林杰同学的博客看.http://www.cnblogs.com/linlinlin/p/4836707.html

  3. 面向对象OO第一单元三次作业总结

    (一)第一单元的作业围绕着多项式的求导,从简单到复杂,主要的要求是 作业一:只有两种格式的因子:带符号整数(+02)和幂函数(x^+02). 作业二:在作业一的基础上添加了:sin(x)和cos(x) ...

  4. 2019OO第三单元作业总结

    OO第三单元的作业主题是JML规格化设计,作业以图及图的最短路径相关计算为载体,体现接口的规格化设计. ------------------------------------------------ ...

  5. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  6. C++模板类内友元(友元函数,友元类)声明的三种情况

    根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{     void bar(); ...

  7. C++(三十四) — 友元函数、友元类

    友元是可以访问类的私有成员和保护成员的外部函数.由 friend 修饰,不是本类的成员函数,但是在它的函数体中可以通过对象名访问本类的私有和保护成员.     友元关系不可传递,且是单向的.    友 ...

  8. 第三次作业:caculator

    第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...

  9. 第三次作业——《K米评测》

    第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...

随机推荐

  1. System V启动脚本启动的服务

    /etc/rc.d/init.d/目录下的内容如下:这些常用的服务器都是System v的服务,要控制System V 的服务,我们可以使用以下命令 #/etc/rc.d/init.d/script  ...

  2. 集训队日常训练20180525-DIV2

    A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { ,a=sqrt( ...

  3. 洛谷P1062 数列 [2017年6月计划 数论03]

    P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… ...

  4. Struts framework

    Struts功能详解——ActionMapping对象 Struts旅程(一)Struts简介和原理 实例讲解DispatchAction和LookupDispatchAction DispatchA ...

  5. UML时序图(Sequence Diagram)学习笔记

    什么是时序图时序图(Sequence Diagram),又名序列图.循序图,是一种UML交互图.它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作. 让我们来看一看visio2016对时序 ...

  6. Leetcode859.Buddy Strings亲密字符串

    给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = "ab& ...

  7. JQuery--val()、html()、text()

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. LintCode刷题笔记-- Count1 binary

    标签: 位运算 描述: Count how many 1 in binary representation of a 32-bit integer. 解题思路: 统计一个int型的数的二进制表现形式中 ...

  9. Android AbsListView子类反复调用getView()和getCount()问题分析

    对于AbsListView子类,假设它的宽高是自适应的,你会发现getView()和getCount()会被疯狂的反复调用.即使在AbsListView子类设置完adapter后,getView()和 ...

  10. C#中App.config文件配置获取

    最新的framework使用如下方法: using System.Configuration; ConfigurationManager.AppSettings["key"]; A ...