C++的四种强制转换

看了很多博客了,发现有的博客总结的不全,还有的跟我在VS2017上输出结果不一样。自己总结了一下

const_cast

这个用的很少,简单讲,就是取消const限定符的作用,然后只能作用于指针及引用。但是,有一个地方很奇怪啊

const int a = 10;
	int b = const_cast<int&>(a);
	b += 10;
	cout <<"a的地址和值:"<< &a << " " << a << endl;//a的地址和值:00BCF8D8 10
	cout << "b的地址和值:" << &b << " " << b << endl;//b的地址和值:00BCF8D8 20

没错,两个变量地址相同,打印的值却不同,有可能是因为,编译器做了优化把值,专门对const_cast做了拷贝。

static_cast

这个很类似,C的强制转换,啥都可以转,但是不能把其他类型转换成指针,也不能把指针转换成其他类型。不过依然主要用于基本类型的转换,因为在用于对象的转换时由下至上的转换它没有检查机制。
在主要说明一个问题,如果类中存在虚函数,那么并且被子类重写了,但是此时你想调用父类的被重写的函数,如下

class A {
public:
	void virtual f() {
		cout << "wo shi  A" << endl;
	}
};

class B :public A {
public:
	virtual void f() {
		cout << "wo shi B" << endl;
	}
	void b() {
		cout << "wo bushi virtual" << endl;
	}
};

你现在初始化了一个B,但是想调用A的f,那么此时可以也是唯一的方法就是用static_cast如下

void AorB(A & a) {
	static_cast<A>(a).f();//wo shi A
}

其他的都不行,因为加入了虚函数,编译器为每一个拥有虚函数的对象,创建了一个虚函数表,调用虚函数都从表中查,具体的百度一下,这边不做详述。在使用,static_cast时会将a转化成A,使用static_cast将子对象转化成父对象时将抛弃,子类的数据域,只对父类数据域做解释。如果使用的是static_cast<A&>(a)那么转化之后依然是调用子类的函数,此时应该是因为C++对多态的支持,编译器认为此时,想要调用的仍是被重写f();下面是例子

class A {
public:
	int a = 10;
	void virtual f() {
		cout << "wo shi  A" <<a<< endl;
	}
};

class B :public A {
public:
	int a = 12;
	virtual void f() {
		cout << "wo shi B" <<a<<endl;
	}
	void b() {
		cout << "wo bushi virtual" << endl;
	}
};

void AorB(A & a) {
	a.a = 5;
	static_cast<A>(a).f();//wo shi  A5
	reinterpret_cast<A&>(a).f();//wo shi B12

dynamic_cast

dynamic_cast只能用于,含有虚函数的类类型,并且只能作用于指针与引用,刚刚说过static_cast也可以用于此,而dynamic_cast与其不同的地方在于,dynamic_cast像它的名字一样,是运行时检查,由于它需要检测对象有虚函数,因此不难推断它是通过虚函数来做运行时检查的,由于能做运行时检查因此,dynamic_cast可以判断是不是由子到父。

	A *a2 = new A();
	B *b2 = dynamic_cast<B*>(a2);
	cout << b2->a;//异常b2nullptr

reinterpret_cast

这个比较厉害,可以进行,整数,地址之间的转换,也可以用作任意指针,引用间的转换。当然由于不进行检查,因此这个转换时最容易出错的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值