本篇将会介绍static_cast,这种转换方式和以前学习的隐式转换很相似,基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方。
1. 隐式转换
在C语言中,存在不通过强制转换就可以将类型进行转换的隐式转换。
例子:
int main() {
int n = 5;
float f = 10.0f;
//本质上发生了隐式转换,将int类型的5转换为float类型
f = n;
return 0;
}
运行结果:
2. 计算机数据存储方式
计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。
例子:对于内存中存放的数0x12345678来说
如果是采用大端模式存放的,则其真实的数是:0x12345678
如果是采用小端模式存放的,则其真实的数是:0x78563412
数据以浮点编码格式,小端序进行保存
3. static_cast
对于上面的隐式转换还是需要人为的去思考转换类型,C++提供了关键字static_cast来明确正在进行隐式转换。
写法如下:
//static_cast作用等价于隐式转换,但是更加明确
f = static_cast<float>(n);
基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方。简单一些的理解就是:将隐式转换显式化表示出来
3.1 可以与不可以转换的情况
#include <iostream>
#include <string>
class CInt {
public:
//对int的转换运算符
operator int() {
return m_nInt;
}
int m_nInt;
};
int main() {
int n = 5;
float f = 10.0f;
double dbl = 1.0;
//本质上发生了隐式转换,将int类型的5转换为float类型
//但是代码上写的不够明确
f = n;
//static_cast作用等价于隐式转换,但是更加明确
f = static_cast<float>(n);
//低风险的转换
//整型与浮点型
n = static_cast<int>(dbl);
//字符与整型
char ch = 'a';//占用一个字节
n = static_cast<int>(ch);
//void*指针的转换
void* p = nullptr;
int* pN = static_cast<int*>(p);
//转换运算符的方式
CInt nObj;
//若没有前面的,这里会把nObj当做对象无法转换
//等价于int kk=nObj
int k = static_cast<int>(nObj);
//高风险的转换
int kk;
char* p;
//整型与指针类型的转换
p = kk;//不可以转换
char* k = static_cast<char*>(kk);//不可以转换
//不同指针类型的转换
int* pK;
char* k = pK;//不可以转换
char* k = static_cast<char*>(pK);//不可以转换
return 0;
}
3.2 基类与派生类之间的转换
实现结果如下:
#include <iostream>
#include <string>
//基类与派生类之间的转换
class CFather
{
public:
CFather() {
m_nTest = 3;
}
virtual void foo() {
std::cout << "CFather()::void foo()" << std::endl;
}
int m_nTest;
};
class CSon : public CFather
{
virtual void foo() {
std::cout << "CSon::void foo()" << std::endl;
}
};
int main() {
CFather* pFather = nullptr;
CSon* pSon = nullptr;
//父类转子类,不安全,子类可能包含的内容更多
//pSon = pFather;//无法通过
//pSon = static_cast<CSon*>(pFather);//可以通过,但是不安全,没有运行时的检测
//子类转父类,安全,子类包含的内容要大于子类
//pFather = pSon;//可以通过
//pFather = static_cast<CFather*>(pSon);//可以通过
}
4.学习视频地址:强制转换static_cast
5.学习笔记:强制转换static_cast学习笔记