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 ...
随机推荐
- 使用Nuget发布自己的类库包
NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件,同时也可以通过NuGet来安装一些V ...
- 通过递归遍历n位2进制数的所有情况
题目要求: 输入一个正整数m,输出m位2进制的所有取值情况,从小到大输出,每个输出结果用换行符分割. 解题思路: 通过递归调用,从第1个到第m个数组元素分别置0和置1,然后当从1到m所有的元素都置0或 ...
- VS code docker 调试 asp.net core
前言 .net core的诞生就是为了解决跨平台的事情的,所以.net core app运行在linux.macOS.docker上也不是什么新鲜事了. 相信已经有不少.net core的项目已经部署 ...
- Mr_matcher的细节3
主要是订阅了playbag发布的scan话题和odom话题 其类型分别为 //cache the static tf from base to laser getBaseToLaserTf(scan_ ...
- CodeForces 489E Hiking (二分+DP)
题意: 一个人在起点0,有n个休息点,每个点有两个数值,分别表示距离起点的距离xi,以及所获得的愉悦值bi,这个人打算每天走L距离,但实际情况不允许他这么做.定义总体失望值val = sum(sqrt ...
- Storm的wordCounter计数器详解
原文:http://www.maoxiangyi.cn/index.php/archives/362 拓扑 点击(此处)折叠或打开 package cn.jd.storm; import backty ...
- 20169219 实验四Android程序设计
一.实现Linux下dc的功能,计算后缀表达式的值 public int evaluate(String expr) { int op1, op2, result = 0; String token; ...
- delphi XE7 在Android编译SharedActivity时出错
delphi XE6 在Android编译SharedActivity时正常,但xe7下编译出错,在uses添加Androidapi.Helpers就可以.
- js任意位数求和
<script> //任意位数求和 function sum(){ if(arguments.length==1) { console.log(arguments[0]) return; ...
- WinForm中ListBox的使用
获取选中数据:listbox.SelectedItem as XXX 重绘每一行item DrawMode设置为DrawMode.OwnerDrawVariable 然后实现DrawItem(obje ...