c++学习笔记十二(类型转换)

类型转换

·隐式类型转化
·显示类型转换

回顾C语言中的转换

//隐式转换:一般由表示范围小的类型转换为表示范围大的类型
int n = 10;
float f = n;
n = f;			//反过来转换会出现截取的情况,有的编译器会警告,有的会报错
				//截取会造成数据的精度的丢失
int* p = &n;
void* v = p;	//隐式转换
p = (int*)v;	//显式转换(强制类型转换)

c++中的四种类型转换

语法

xxx_cast <类型> (表达式)

一.static_cast

用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。
主要有如下:

1.基本数据类型转换

int转换成char

int n = 97;
cout << n << '\t' << (char)n << '\t' << static_cast<char>(n) << endl;

int转换成float

int n = 1;
cout << n/2 << '\t' << (float)n/2 << '\t' << static_cast<float>(n)/2 << endl;

指针/引用转换
void指针转换成目标类型的指针,这种转换是不安全的,也需要程序员来保证;
如下代码编译出错,因为不能把void*转换成其他具体指针。

void* pd = new Derive;
Base* pb = pd; //  error: invalid conversion from ‘void*’ to ‘Base*’
pb->Print();

把Base* pb = pd;改为Base* pb = static_cast<Base*>(pd);,可以解决上述编译错误

2.int转换成enum
enum Week{
   SUN,MON,TUE,WED,THU,FRI,SAT
};
Week day = static_cast<Week>(0);		//week代表枚举的类型
3.基类和子类之间指针和引用的转换

·上行转换,把子类的指针或引用转换成父类,这种转换是安全的(通常使用默认转换)。
·下行转换,把父类的指针或引用转换成子类,这种转换是不安全的,也需要程序员来保证(通常使用dynamic_cast)
可以记为:爸爸大,儿子小,爸爸可以装下儿子,但是儿子不一定能装下爸爸

上行转换
已知存在继承关系的两个类Base与Derive:

class Base{									//定义一个父类
public:
    void Print(){cout << "Base" << endl;}
};
class Derive:public Base{					//定义一个子类
public:
    void Print(){cout << "Derive" << endl;}
};
int main(){
// 对象
    Derive d;
    Base b = static_cast<Base>(d);
    b.Print();
// 引用
    Base& fb = static_cast<Base&>(d);
    fb.Print();
// 指针
    Base* pb = static_cast<Base*>(new Derive);			//子类指针必须指向父类对象
    pb->Print();
}

通常使用隐式转换:

// 对象
	Derive d;
	Base b = d;
	b.Print();
// 引用
	Base& fb = d;
	fb.Print();
// 指针
	Base* pb = new Derive;
	pb->Print();

下行转换
这种转换不安全,通常使用dynamic_cast
注意:static_cast跟传统小括号转换方式几乎是一致的

二.const_cast

常量赋值给非常量时,会出现下面编译错误:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值