友元函数:不是类的成员函数,但是能够访问类的私有数据成员。

之前有个矛盾就是规定非成员函数不能直接访问类的私有数据,但是这会儿却可以,但那只是针对常规非成员函数而言,特殊的非成员函数就可以访问类的私有数据——友元函数

友元函数就是这么特殊,虽然在类中声明,却不是类的成员函数,这是因为加了前缀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-友元类是什么的更多相关文章

  1. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  2. C++友元(友元函数、友元类和友元成员函数)

    友元(友元函数.友元类和友元成员函数) C++ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私 ...

  3. 12.3——类作用域,构造函数,友元,static类成员

    类作用域: (1)成员函数在类外定义时,因为函数体还有形参列表都出现在成员名之后,都是在类作用域内定义,所以不用加域作用符 来引用其他的成员. (2)函数的返回值不一定需要在类的作用域中,但是若是返回 ...

  4. cb02a_c++_数据结构_顺序容器_STL_list类_双向链表

    /*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...

  5. cb01a_c++_数据结构_顺序容器_STL_deque类

    /*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...

  6. C++拾遗(十三)友元和嵌套类

    友元类 使用友元的场合: 1.两个类既不是is-a关系也不是has-a关系,但是两个类之间又需要有联系,且一个类能访问另一个类的私有成员和保护成员. 2.一个类需要用到另外多个类的私有成员. C++p ...

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

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

  8. c++友元函数友元类

    友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...

  9. C++开发系列-友元函数 友元类

    友元函数 默认一个类的私有属性只能在该类的内部可以直接访问.友元函数申明在内的内部,实现在类的外部可以直接访问类的私有属性. class A1 { public: A1() { a1 = 100; a ...

随机推荐

  1. Build Path

    ------------siwuxie095 什么是 Build Path? 为什么使用 Build Path? 如: (1)创建一个Java工程:LearnBuildPath (2)点击 Next, ...

  2. 一个jquery在不同浏览器下的兼容性问题。

    <div id ='pdiv' style='visibility:hidden;'> <div id='cdiv'>子元素</div> </div> ...

  3. 383. Ransom Note 在字典数组中查找笔记数组

    [抄题]: Given an arbitrary ransom note string and another string containing letters from all the magaz ...

  4. 665. Non-decreasing Array只允许修改一位数的非递减数组

    [抄题]: Given an array with n integers, your task is to check if it could become non-decreasing by mod ...

  5. POI 生成exel报表

    去官网下载相关jar包   http://poi.apache.org/ package poi.zr.com; import java.io.File; import java.io.FileNot ...

  6. keepalived+lvs高可用配置

    global_defs { notification_email { test@qq.com } notification_email_from sns-lvs@gmail.com smtp_serv ...

  7. ThinkPHP5权限控制

    我在用ThinkPHP5做开发的时候发现,它没有权限类,自己写太麻烦,于是就想到了把TP3里面的权限类拿来修改使用,结果这种方法是可行的,下面记录附上修改后的Auth.php权限类 <?php ...

  8. css总结6:行高和字体大小

    1 CSS line-height 属性 代码: p.small {line-height:70%}p.big {line-height:200%} 运行后:70%与200%宽高 2 CSS font ...

  9. 通过vb.net 和NPOI实现对excel的读操作

    通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...

  10. 软件工程:Java实现WC.exe基本功能

    项目相关要求 GitHub地址:https://github.com/3216004716/WC 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处 ...