友元、异常和其他

友元、异常和其他

类型转换运算符

  • 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)

  • 条件(满足条件之一即可):
  1. type-name可被隐式转换为expression所属的类型。
  2. expression可被隐式转换为type-name所属的类型。
  • 用处:
  1. 基本类型之间的转换
  2. 具有继承关系的类型的转换
//具有继承关系的类型转换:
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 = 300float 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

猜你喜欢

转载自blog.csdn.net/m0_46427273/article/details/110732651