C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码

四种类型转换(cast)的关键字 详解 及 代码


本文原创, 禁止转载, 如有需要, 请站内联系.

本文地址: http://blog.csdn.net/caroline_wendy/article/details/19042529


C++中常见的面试题.

题目: 关于C++中, 四种类型转换的关键字, 的详解, 也可以给出代码, 判断输出 或 判断哪些代码有误.


答案及范例如下:


四种关键字: const_cast, 常量性转除;dynamic_cast, 向下安全转型;reinterpret_cast, 重新解释转型; static_cast, 静态转型;

1.  const_cast, 常量性转除:

主要对变量的常量性(const)进行操作, 移除变量的常量性, 即可以被非常量指向和引用, 详见代码;

2. dynamic_cast, 向下安全转型:

主要应用于继承体系, 可以由 "指向派生类的基类部分的指针", 转换"指向派生类"或"指向兄弟类";

static_cast只能转换为"指向派生类";

3. reinterpret_cast, 重新解释转型:

主要是对2进制数据进行重新解释(re-interpret),不改变格式, 而static_cast会改变格式进行解释; 

由派生类转换基类, 则重新解释转换, 不改变地址, 静态转换改变地址;

4. static_cast, 静态转型:

主要是数据类型的转换, 还可以用于继承;


代码如下:

/*
 * cppprimer.cpp
 *
 *  Created on: 2014.2.10
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>

/*常量性移除指针详解*/

struct S {
	S() : value(0) {}
	int value;
};

void CastConst (void)
{
	const S s;
	std::cout << "s.value = " << s.value << std::endl;
	//S* ps = &s; //error, 指向常量
	S* ps = const_cast<S*>(&s);
	ps->value = 1;
	std::cout << "s.value = " << s.value << std::endl;
	//S& rs = s; //error, 引用常量
	S& rs = const_cast<S&>(s);
	rs.value = 2;
	std::cout << "s.value = " << s.value << std::endl;
}

/*安全向下转型*/

struct B /*基类B*/ {
	virtual void f() { std::cout << "Base::f" << std::endl; }
	void thisf() { std::cout << "Base::thisf" << std::endl;}
	virtual ~B() {}
};

struct B2 /*基类B2*/ {
	virtual void g() { std::cout << "Base2::g" << std::endl; }
	void thisg() { std::cout << "Base2::thisg" << std::endl;}
	virtual ~B2() {}
};

struct D : public B, public B2 /*派生类D*/ {
	virtual void f() { std::cout << "Derived::f" << std::endl; }
	virtual void g() { std::cout << "Derived::g" << std::endl; }
	virtual ~D() {}
};

void CastDynamic (void)
{
	 B* pB_D = new D;
	 pB_D->f();
	 //pD->g(); //error, 只包含B部分

	 D *pD_D = dynamic_cast<D*>(pB_D); //转换为派生类
	 pD_D->g();
	 B2* pB2_D = dynamic_cast<B2*>(pB_D); //转换为兄弟类
	 pB2_D->g();

	 D *pD_Ds = static_cast<D*>(pB_D);
	 pD_Ds->g();
	 //B2* pB2_Ds = static_cast<B2*>(pB_D); //error, 不能转换为兄弟类
}

/*重新解释转型*/

struct rA { int m_a; };
struct rB { int m_b; };
struct rC : public rA, public rB {};

void CastReinterpret (void)
{
	int *i= new int;
	*i = 10;
	std::cout << "*i = " << *i << std::endl;
	std::cout << "i = " << i << std::endl;
	double *d=reinterpret_cast<double*> (i);
	std::cout << "*d = " << *d << std::endl;
	std::cout << "d = " << d << std::endl;

	rC c;
	std::cout << "&c = " << &c << std::endl
			<< "reinterpret_cast<rB*>(&c) = " <<reinterpret_cast<rB*>(&c) << std::endl
			<< "static_cast <rB*>(&c) = " << static_cast <rB*>(&c) << std::endl
			<< "reinterpret_cast<rA*>(&c) = " <<reinterpret_cast<rA*>(&c) << std::endl
			<< "static_cast <rA*>(&c) = " << static_cast <rA*>(&c) << std::endl
			<< std::endl;
}

int main (void)
{
	std::cout << std::endl << "常量性转除:" << std::endl;
	CastConst();
	std::cout << std::endl << "安全向下转型:" << std::endl;
	CastDynamic();
	std::cout << std::endl << "重新解释转型:" << std::endl;
	CastReinterpret();
}

输出:

常量性转除:
s.value = 0
s.value = 1
s.value = 2

安全向下转型:
Derived::f
Derived::g
Derived::g
Derived::g

重新解释转型:
*i = 10
i = 0x471718
*d = 2.55917e-307
d = 0x471718
&c = 0x22feb0
reinterpret_cast<rB*>(&c) = 0x22feb0
static_cast <rB*>(&c) = 0x22feb4
reinterpret_cast<rA*>(&c) = 0x22feb0
static_cast <rA*>(&c) = 0x22feb0





  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SpikeKing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值