友元、异常和其他
类型转换运算符
- dynamic_cast
作用: 在类层次结构中进行向上转换,这种转换是在运行时进行的并非在编译时进行,只能用于继承类对象的指针之间或引用之间进行类型转换 eg:
Low * pl = dynamic_cast<Low *> ph; //Low是High的可访问基类,ph的类型为High*
eg:
struct A1
{
virtual ~A1() {
};
};
struct A2
{
virtual ~A2() {
};
};
struct B : A1, A2
{
};
int main()
{
B b;
A1 * pb1 = &b;
A2 * pb2 = dynamic_cast<A2 *>(pb1); //正确的,A1类型的指针所指向的对象为派生类对象,因此向上转换是合法的。
//运行dynamic_cast的操作数必须是多态类类型,因此A1中的virtual是不能去掉的。
A2 * pbb = static_cast<A2 *>(pb1); //不允许, 因为A2* pbb = pb1;是错误的,并且A1 * pb1 = pbb;也是错误的。
}
- const_cast
作用: 改变值为const或volatile
volatile:即使程序代码没有对内存单元进行修改,其值也可能发生变化。
High bar;
const High * pbar= &bar;
High * pb = const_cast<High *> //允许的
const Low * pl = const_cast<const Low *> (pbar); //不允许
const_cast中的类型必须时指针或引用
const_cast不能用于指向“自出生就是const的内存空间”,否则该const_cast的行为未定义。
- 一段奇怪的代码
const int pop2 = 2000; //加上volatile值会同步改变
int* pt = const_cast<int *>(&pop2);
cout << pt << endl;
cout << &pop2 << endl;
*pt = 20;
cout << *pt << endl;
cout << pop2 << endl;
cout << pt << endl;
cout << &pop2 << endl;
cout << *pt << endl;
你使用 了「const 」,就是对编译器说:我这个值是不变的,请随意优化。编译器就优化了,有可能一直放寄存器里,不是每次从内存读取。
后来,你自己又私自改变设定,自己绕着方法去修改那个内存,想因此改变src,然而,在优化之后,这并没有什么卵用。。。。
- static_cast
作用:
static_cast<type-name> (expression)
- 条件(满足条件之一即可):
type-name
可被隐式转换为expression
所属的类型。expression
可被隐式转换为type-name
所属的类型。
- 用处:
- 基本类型之间的转换
- 具有继承关系的类型的转换
//具有继承关系的类型转换:
High bar;
Low blow; //Low是基类,High为派生类
High * pb = static_cast<High *>(&blow); //合法的
Low * pl = static_cast<Low *>(&bar); //合法的
Pond * pmer = static<Pond *>(&blow) //不合法的
//基本类型转换
int i = 300;
float d = static_cast<float> (i); //合法的
- reinterpret_cast
**作用:**将一个类型的指针转换为另一个类型,将指针值转换为一个整型数。
int d = 297;
int* pd = &d;
char* pi = reinterpret_cast<char*>(pd);
cout << *pi << endl; //显示(
cout << *pd << endl; //显示297