C++_友元1-友元类是什么
友元函数:不是类的成员函数,但是能够访问类的私有数据成员。
之前有个矛盾就是规定非成员函数不能直接访问类的私有数据,但是这会儿却可以,但那只是针对常规非成员函数而言,特殊的非成员函数就可以访问类的私有数据——友元函数。
友元函数就是这么特殊,虽然在类中声明,却不是类的成员函数,这是因为加了前缀friend。
友元不仅包含函数,类也可以当友元,也就是友元类。
友元类的所有方法都可以访问原始类的私有成员和保护成员。
也可以做更严格的限制,只将限定的成员函数指定为另一类的友元。
尽管友元被授予从外部访问类的私有部分的权限,但它们并不与面向对象的编程思想相违背。
接下来就是讨论友元类:
假定要编写一个模拟电视机和遥控器的简单程序。
决定定义一个Tv类和一个Remote类,来分别表示电视机和遥控器。
很明显,这两个类之间应当存在某种关系,遥控器并非电视机,反之亦然,
但是遥控器却可以改变电视机的状态。这样的关系可以将Remote类作为Tv类的一个友元来实现。
友元类声明位置无关紧要,可以声明在公有、私有、保护部分;
定义一个电视机类,用一些状态成员来表示电视机:
开/关;
频道设置;
音量设置;
有线电视or天线调节模式;
TV调谐或A/V输入
tv.h文件,声明tv和remote的类
#ifndef TV_H_
#define TV_H_ class Tv
{
public:
friend class Remote;
enum{Off, On};
enum{MinVal, MaxVal=};
enum{Antenna, Cable};
enum{TV,DVD}; Tv():state(s),volume(),maxchannel(mc),channel(),mode(Cable),input(TV){}
void onoff() {state=(state == On)?Off:On;}
bool ison() const {return state==On;}
bool volup();
bool voldown();
void chanup();
void chandown();
void set_mode() {mode=(mode == Antenna)?Cable:Antenna;}
void set_input() {input=(input == TV)?Cable:Antenna;}
void settings() const; //display all settings;
private:
int state; //on or off
int volume;
int maxchannel;
int channel; //current channel setting
int mode; //broadcast or cable
int inputs; //TV or DVD
}; class Remote //Remote方法以TV的对象引用作为参数,这表明遥控器必须针对特定的电视机
{
public:
int mode; //controls TV or DVD;
private:
Remote(int m=Tv::Tv): mode(m) {}
bool volup(Tv & t) {return t.volup();}
bool voldown(Tv & t) {return t.voldown();}
void onoff(Tv & t) {t.onoff();}
void chanup(Tv & t) {t.chanup();}
void chandown(Tv & t) {t.chandown();}
void set_chan(Tv & t, int c) {t.channel = c;}
void set_mode(Tv & t) {t.set_mode();}
void set_input(Tv & t) {t.set_input();}
};
#endif
tv.cpp
#include <iostream>
#include "tv.h" bool Tv::volup()
{
if(volume<MaxVal)
{
volume++;
return true;
}
else
return false;
} bool Tv::voldown()
{
if(volume>MinVal)
{
volume--;
return true;
}
else
return false;
} void Tv:chanup()
{
if(channel<maxchannel)
channel++;
else
channel=;
} void Tv::chandown()
{
if(channel>)
channel--;
else
channel = maxchannel;
} void Tv::Settings() const
{
using std::cout;
using std::endl;
cout<<"TV is "<<(state==Off?"Off":"On")<<endl;
if(state == On)
{
cout<<"Volume setting = "<<volume<<endl;
cout<<"Channel setting = "<<channel<<endl;
cout<<"Mode = "<<(mode == Antenna? "antenna":"cable")<<endl;
cout<<"Input = "<<(mode == TV? "TV":"DVD")<<endl;
}
}
use_tv.cpp
#include<iostream>
#include "tv.h" int main()
{
using std::cout;
Tv s42;
cout<<"Initial settings for 42\" TV:\n";
s42.settings();
s42.onoff();
s42.chanup();
cout<<"\nAdjusted settings for 42\" TV:\n";
s42.chanup();
cout<<"\nAdjusted settings for 42\" TV:\n";
s42.settings(); Remote grey; grey.set_chan(s42, );
grey.volup(s42);
grey.volup(s42);
cout<<"\n42\" settings after using remote:\n";
s42.settings(); Tv s58(Tv::On);
s58.set_mode();
grey.set_chan(s58,);
cout<<"\n58\" settings:\n";
s58.settings();
return ;
}
C++_友元1-友元类是什么的更多相关文章
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- C++友元(友元函数、友元类和友元成员函数)
友元(友元函数.友元类和友元成员函数) C++ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私 ...
- 12.3——类作用域,构造函数,友元,static类成员
类作用域: (1)成员函数在类外定义时,因为函数体还有形参列表都出现在成员名之后,都是在类作用域内定义,所以不用加域作用符 来引用其他的成员. (2)函数的返回值不一定需要在类的作用域中,但是若是返回 ...
- cb02a_c++_数据结构_顺序容器_STL_list类_双向链表
/*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...
- cb01a_c++_数据结构_顺序容器_STL_deque类
/*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...
- C++拾遗(十三)友元和嵌套类
友元类 使用友元的场合: 1.两个类既不是is-a关系也不是has-a关系,但是两个类之间又需要有联系,且一个类能访问另一个类的私有成员和保护成员. 2.一个类需要用到另外多个类的私有成员. C++p ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- c++友元函数友元类
友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...
- C++开发系列-友元函数 友元类
友元函数 默认一个类的私有属性只能在该类的内部可以直接访问.友元函数申明在内的内部,实现在类的外部可以直接访问类的私有属性. class A1 { public: A1() { a1 = 100; a ...
随机推荐
- laravel中的文件上传到本地+七牛云上传
首先在filesystems.php 配置好上传的文件的目录起名为upload 在Storage/目录下面 目录下面的app/upload 如果没有这个文件会自动创建 这里的名字upload名字是跟控 ...
- (二)在eclipse中使用maven
二.配置Maven插件 2.1.配置使用的Maven
- fail-fast 与 fail-save 机制的区别
link:https://blog.csdn.net/bigtree_3721/article/details/67095084
- Docker学习笔记_安装和使用Rabbitmq
一.准备 1.宿主机OS:Win10 64bit 2.虚拟机OS:Ubuntu18.04 3.账号:docker 4.虚拟机IP:192.168.8.25 二.安装 1.搜索镜像 ...
- 数据标准化方法及其Python代码实现
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间.目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法.标准差法).折线型方法(如三折线法).曲线型方法 ...
- 12.Alias(别名)
通过使用 SQL,可以为列名称和表名称指定别名(Alias). SQL Alias 表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS a ...
- 关于 Azure 安全性的 10 点提示
讨论云服务时,安全性是一个关键领域.实际上,Windows Azure 基础结构实施大量的技术和流程来保护环境.此页介绍 Microsoft 的全球基础服务如何运行基础结构以及它们实施的安全措施. 从 ...
- 注入学习1:SQL注入语句大全
学习背景 之前做了xss预防,以及些许的注入预防了,但是不够全面,如果还是搜集了下一些常用的注入手段,以此用来进行更好的预防. 什么是注入 一般来说,SQL注入一般存在于形如:HTTP://xxx.x ...
- 使用Jenkins远程部署war包到tomcat container
Jenkins首先使用maven将源代码进行编译打包,之后需要将war包传送到tomcat服务器上进行部署. 来看一下Jenkins的基本配置,首先需要安装插件"Deploy to cont ...
- 什么是“光照度(Illuminance)”?
光照度是光度学的概念,了解光照度,要从人眼的特性说起. 人眼的光谱响应 传统的辐射度学的概念(如“功率”,单位为“瓦”)可以客观描述“能量”,但当其用来描述“光照”时却是不合适的,原因在于:人眼对不同 ...