类可以允许其他类或者函数访问它的私有成员,方法是令其他类或者函数成为它的友元。如果类想把一个函数或者类声明成它的友元,只需要增加一条以friend关键字开始的声明语句即可。 友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限。友元不是类的成员也不受它所在区域访问控制级别的约束,一般来说,最 ...
分类:
编程语言 时间:
2017-02-26 10:58:39
阅读次数:
218
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的。如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。 1. 一对一友好关系 类模板与另一个(类或函数)模板间友好关系的最常见形式是建立对应实例及其 ...
分类:
编程语言 时间:
2016-08-03 13:26:23
阅读次数:
206
友元类 使用友元的场合: 1、两个类既不是is-a关系也不是has-a关系,但是两个类之间又需要有联系,且一个类能访问另一个类的私有成员和保护成员。 2、一个类需要用到另外多个类的私有成员。 C++primer一书中给出的例子:电视和遥控器。 友元声明可以位于原始类的任何位置(public,priv ...
分类:
编程语言 时间:
2016-06-01 15:31:15
阅读次数:
182
近日在改动了一下下引擎代码(为了自己的组件),发现有些接口是仅仅有特定类及其内部函数才去訪问,却不使用友元声明的形式进行数据訪问——当然使用了普通非virtual的形式也就是意味着不建议重载。 故此: 1、建议派生类(或同意)重载的声明为虚函数即virtual类型, 2、强制派生类实现的声明为纯虚函
分类:
编程语言 时间:
2016-03-08 19:31:29
阅读次数:
121
运算符重载
运算符重载就是对已有的C++运算符赋予更多的语义,让一个运算符可以作用于其他的数据类型。 典型地,让运算符接受一个类的对象作为参数。通常有两种方式来重载一个运算符:
声明一个普通函数,作为类的友元。声明为类的成员方法。
事实上,运算符的本质是函数。每个运算符调用会转换为函数调用,运算符的操作数转换为函数参数。 运算符的重载本质上是方法的重载。
这些运算符不允...
分类:
编程语言 时间:
2015-08-18 16:32:18
阅读次数:
178
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。
友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以frend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所有它们不受其声明出现部分的访...
分类:
编程语言 时间:
2015-06-08 09:52:36
阅读次数:
135
注: 友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。所以,友元声明只能出现在类定义中。因为友元不是授权类的成员,所以它不受其所在类的声明区域public private 和protected 的影响。即友元函数的声明可以出现在类的任何地方
class A
{...
分类:
其他好文 时间:
2014-12-08 17:55:07
阅读次数:
121
近日在修改了一下下cocos2d-x的引擎代码(为了自己的组件),发现有些类的访问形式比较怪异,明明有些接口是只有特定类及其内部函数才去访问,却不使用友元声明的形式进行数据访问——当然使用了普通非virtual的形式也就是意味着不建议重载。
故此:
1、建议派生类(或允许)重载的声明为虚函数即virtual类型,
2、强制派生类实现的声明为纯虚函数
3、不希望派生类重载或覆盖的函数则为普通...
分类:
其他好文 时间:
2014-11-03 20:57:22
阅读次数:
196
在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。(1)普通友元:templateclass A{ friend void f...
分类:
编程语言 时间:
2014-10-29 19:17:39
阅读次数:
226
当将一个类A的成员函数A::F设置成类B的友元时,需要预先定义类A,否则不能将A::F指定为友元。而在定义B之后,才能定义A::F,因为A::F被设为 友元正是为了访问类B的成员函数。所以,可以按照如下的顺序:声明类B定义类A,声明但不实现A::F定义类B,设置A::F为友元实现A::F下面是一个例...
分类:
其他好文 时间:
2014-08-08 20:59:56
阅读次数:
276