1.友元类:
friend class Remote;
上述语句可以使Remote成为友元类,位置任意,共有、私有或保护均可,
2.让特定的类成员成为另一个类的友元:
为了使编译器处理语句:
class TV
{
friend void Remote::set_chan(Tv & t, int c)
……
}
其需要知道Remote的定义,而该方法提及了Tv对象,因此Tv定义应当位于Remote定义之前:
class TV;
class Remote { friend……};
class Tv{……};
以上先声明类而不定义的排列可以满足一般需求。
3.内联函数:
内联函数的链接性是内部的,因此函数定义必须在使用函数的文件中,而以下例子:
class Tv;
class Remote
{
……
bool volup(Tv & t);
……
};
class Tv
{
……
bool volup();
……
};
inline bool Remote::volup(Tv & t) { return t,volup(); }
……
内敛定义位于头文件中,因此在使用函数的文件中包含头文件可确保将定义放在正确的位置,也
可以将定义放在实现文件中,但必须删除关键字inline,使得函数的链接性是外部的。
这类inline声明在有共同友元的类中常用。
4.嵌套类
可在类中定义另一个类(或结构体),例如链表类:
templateclass List { private: struct Node { Type m_data; Node* next; Node(const Type& data) : m_data(data), next(0) {} }; ……
5.异或运算符:^=
该运算符可以简化部分代码,使得对象在两种状态之间切换,如:
void onoff() {state = (state == On) ? Off : On;}
可以简化为:
void onoff() {state ^= 1;}
6.运算符dynamic_cast:如果可以的话将使用一个指向基类的指针来生成一个指向派生类的指针,
否则该运算符返回0——空指针,请求不正确时引发类型为bad_cast的异常
可以使用该dynamic_cast运算符来检查是否可以将某个类型安全地转换为了另一类型,例:
Superb * pm = dynamic_cast(pg);
即可判断指针pg能否被安全得转换为Superb*。
7.type_info:结构储存了有关特定类型的信息,是在头文件typeinfo中定义的一个类,包含运算符
typeid:运算符返回一个指出对象的类型的值,可以接受两种参数:
(1)类名 (2)结果为对象的表达式
其重载了==和!=等运算符,因此可以:
typeid(Magnificent) == typeid(*pg)
如果pg指向的是一个Magnificent对象,则上述表达式的结果为true,否则为false
如果pg是一个空指针会引发bad_typeid异常
也可以显示指针指向的对象所属的类定义的字符串,如:
cout << typeid(*pg).name() << endl;
一般情况下RTTI(即以上两个运算符)使用需注意代码的繁杂,常用格式类似于:
if(ps = dynamic_cast(pg) ) ps->Say();
8.类型转换运算符
(1)dynamic_cast:使得能够在类层次结构中进行向上转换,即从派生类到基类,而不允许其他转
换,语法如下:
dynamic_cast < type-name >(expression)
(2)const_cast:执行只有一种用途的类型转换,即改变值为const或volatile,可以去除这两类
关键字的约束,如:
High bar;
const High * pbar = &bar;
……
High * pb = const_cast (pbar);
以上类型转换使得*pb成为一个可以用于修改bar对象值的指针,它删除const标签。
const Low * p1 = const_cast(pbar); //invalid
以上使用方法非法,因为它同时尝试将类型从const High * 改为const Low *
语法如下:
const_cast < type-name >(expression)
(3)static_const:使得基类也可以向派生类转换,如:
High bar;
Low bar;
……
High * pb = static_cast (&blow);
Low * pl = static_cast (&bar);
其中High是Low的基类,因此从High->Low, Low->High的转换都是合法的,当然也可用其将枚举值
转换成整型,double转换成int等等,语法如下:
static_cast < type-name >(expression)
(4)reinterpret_cast:支持一些奇奇怪怪的操作
struct dat {short a; short b;};
long value = 12414123;
dat * pd = reinterpret_cast< dat *> (&value);
但是某些操作同样不合法,如不能将指针转换成更小的整形或浮点型,不能将函数指针转换成为
数据指针等等。



