第十五章(1)

现在讲的越来越深了,有的时候笔记都不知道怎么记了,很多也只能直接抄书上的。这里尽力吧,原谅我们这些初学者:)

1. 友元

友元现在很熟悉了,如果声明一个函数为一个类的友元,则这个函数可以访问这个类的成员。类也可以将类作为友元,这样友元类的所有方法都可以访问原始类的私有成员和保护成员。

这样有什么作用呢?书中举了一个Tv类和一个Remote类的例子。两个类没有从属关系,更像是朋友关系,这个时候就可以把remote类作为tv类的友元。定义成友元类也很简单:

在Tv类的声明里的public成员部分声明

friend class Remote;

Tv类有换频道的方法成员chanup(), chandown(),有调声音的方法成员volup(), voldown()等等,还有表示声音的数据成员volume,表示最多频道上限度数据成员maxchannel等。

Remote类基本就是遥控Tv换频道或者调声音了,这个方法成员需要和Tv类的方法成员同名,且返回值也相同

如Tv类的方法有

bool volup(); bool voldown(); void chanup(); void chandown();

Remote类的这些方法应该这样声明定义:

bool volup(Tv & t) {return t.volup();} 

bool voldown(Tv & t) {return t.voldown();} 

void chanup(Tv & t) {return t.chanup();} 

void chandown(Tv & t) {return t.chandown();} 

很明显,当Remote调用这些方法时,实际上是调用了Tv的同名方法。同时Remote的这些方法都将一个Tv对象引用作为参数,这表明遥控器必须指向特定的电视机。这个跟现实一样,不难理解。

Remote不仅能访问Tv的方法成员,也可以访问数据成员,无论private与否。比如Remote设置频道的函数就可以这样:

void set_chan(Tv & t, int c) { t.channel = c;}


也可以只让Remote::set_chan()成为Tv类的方法,因为Tv的public 方法成员外部可见的,不需要把Remote设成Tv的友元也能实现。单独把一个类的方法声明为另一个类的友元如下:

class Tv

{

friend void Remote::set_chan(Tv & t, int c);

...

}

这个时候必须在声明class Tv前声明Remote,这就是所谓的向前声明,具体做法如下:

class Tv;

class Remote { ...};

class Tv {...};

Remote其他方法因为调用了Tv类的方法成员,所以其定义必须写在Tv类的方法成员声明之后。


这以上说的都是Remote是Tv的友元,同时也可以把Tv声明为Remote的友元。用法与上面相同,没有什么特别的


2. 嵌套类

嵌套类很好理解了,就是在另一个类里面声明的类。这其实是一个作用域和访问权限的问题,取决于嵌套类的属性:private,protected还是public的。private就是只有包含塔的类可以看见使用它,其他类根本不知道这个类的存在;protected就是包含类和它的派生类知道这个类,可以使用它;public就是大家都知道这个类,可以在外面创建这个类的对象,但创建这个嵌套类的对象时必须加上它的包含类和作用解析符,如书中给的例子:

Team::coach forhire;

嵌套类很适合模板类,具体见书中的例子类



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值