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 ...
随机推荐
- Build Path
------------siwuxie095 什么是 Build Path? 为什么使用 Build Path? 如: (1)创建一个Java工程:LearnBuildPath (2)点击 Next, ...
- 一个jquery在不同浏览器下的兼容性问题。
<div id ='pdiv' style='visibility:hidden;'> <div id='cdiv'>子元素</div> </div> ...
- 383. Ransom Note 在字典数组中查找笔记数组
[抄题]: Given an arbitrary ransom note string and another string containing letters from all the magaz ...
- 665. Non-decreasing Array只允许修改一位数的非递减数组
[抄题]: Given an array with n integers, your task is to check if it could become non-decreasing by mod ...
- POI 生成exel报表
去官网下载相关jar包 http://poi.apache.org/ package poi.zr.com; import java.io.File; import java.io.FileNot ...
- keepalived+lvs高可用配置
global_defs { notification_email { test@qq.com } notification_email_from sns-lvs@gmail.com smtp_serv ...
- ThinkPHP5权限控制
我在用ThinkPHP5做开发的时候发现,它没有权限类,自己写太麻烦,于是就想到了把TP3里面的权限类拿来修改使用,结果这种方法是可行的,下面记录附上修改后的Auth.php权限类 <?php ...
- css总结6:行高和字体大小
1 CSS line-height 属性 代码: p.small {line-height:70%}p.big {line-height:200%} 运行后:70%与200%宽高 2 CSS font ...
- 通过vb.net 和NPOI实现对excel的读操作
通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...
- 软件工程:Java实现WC.exe基本功能
项目相关要求 GitHub地址:https://github.com/3216004716/WC 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处 ...