C++四种类型转换

1. 强制类型转换(显示类型转换)  C语言风格

int k = 5 % 3.2        // 语法错误
int k = 5 % (int)3.2;  // 强制类型转换,C语言风格
int k = 5 % int(3.2);  // 强制类型转换,C语言风格

2. 隐式类型转换

系统自动转换。

int sum = 3 + 12.333;  // 15, 发生隐式类型转换

3. C++四种类型转换

3.1 static_cast

静态转换。类似于C风格的强制类型转换,编译时进行类型转换检查,需要自己保证正确。

3.1.1 适用情况:

(a)相关类型;如整型和浮点型。

double f = 100.34f;
int i = (int)f;                // C语言风格
int i2 = static_cast(f);  // C++风格

(b)void*与其他类型指针转换。

void*转为其他类型时要注意,因为各类型的寻址范围、成员布局可能不同,在这种情况下互转可能出错。

int i = 10;
int* b = &i;
void* p = static_cast(b);   // int*转为void*
int* p2 = static_cast(p);    // void*转为int*

(c)派生类指针或引用转为基类指针或引用。

class Base {    // 基类
};

class Derive : public Base {     // 派生类
};

shared_ptr d2 = make_shared();  
Base* b2 = static_cast(d2.get());  // 派生类指针转为基类指针

Derive d3;
Base& b3 = static_cast(d3);  // 派生类引用转为基类引用 

3.1.2 不适用情况

(a)一般不能用于指针类型之间的转换;

shared_ptr a = make_shared(10);
double* b = static_cast(a.get());    // 错误!

shared_ptr a1 = make_shared(10);
int* b1 = static_cast(a1.get());        // 错误!

3.2 dynamic_cast

运行时类型转换检查。

3.2.1 适用情况

(a) 基类指针或引用转为派生类指针或引用,不能转对象。

待补充。


3.3 const_cast

去除指针引用的const属性。

const int i = 10;
int i2 = const_cast(i);       // 错误

const int* p = &i;
int* pi = const_cast(p);     // 正确
*pi = 20;     // 未定义行为(打印结果和调试结果不一致,很诡异),禁止如此操作

const int& refi = i;
int& ri = const_cast(refi);  // 正确

3.4 reinterpret_cast

编译时进行类型转换检查。

可以进行无关类型的转换,随意转换。

比较危险,尽量避免使用。

3.4.1 适用情况

指针类型与数值型互转。

你可能感兴趣的:(C++基础,c++)