Greedysky:C++11 新特性之强制类型转换static_cast
这是C++11新特性介绍的第十二部分,涉及到强制类型转换static_cast的相关内容。
static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。本节介绍static_cast操作符。
● 编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。
1
2
|
double a = 1.999;
int b = static_cast<double>(a); //相当于a = b ;
|
当编译器隐式执行类型转换时,大多数的编译器都会给出一个警告:
1
|
e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据
|
使用static_cast可以明确告诉编译器,这种损失精度的转换是在知情的情况下进行的,也可以让阅读程序的其他程序员明确你转换的目的而不是由于疏忽。把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。
● 使用static_cast可以找回存放在void*指针中的值。
1
2
3
4
|
double a = 1.999;
void * vptr = & a;
double * dptr = static_cast<double*>(vptr);
cout<<*dptr<<endl;//输出1.999
|
static_cast也可以用在于基类与派生类指针或引用类型之间的转换。然而它不做运行时的检查,不如dynamic_cast安全。static_cast仅仅是依靠类型转换语句中提供的信息来进行转换,而dynamic_cast则会遍历整个类继承体系进行类型检查,因此dynamic_cast在执行效率上比static_cast要差一些。现在我们有父类与其派生类如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class ANIMAL
{
public:
ANIMAL():_type("ANIMAL"){};
virtual void OutPutname(){cout<<"ANIMAL";};
private:
string _type ;
};
class DOG:public ANIMAL
{
public:
DOG():_name("大黄"),_type("DOG"){};
void OutPutname(){cout<<_name;};
void OutPuttype(){cout<<_type;};
private:
string _name ;
string _type ;
};
|
此时我们进行派生类与基类类型指针的转换:注意从下向上的转换是安全的,从上向下的转换不一定安全。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int main()
{
//基类指针转为派生类指针,且该基类指针指向基类对象。
ANIMAL * ani1 = new ANIMAL ;
DOG * dog1 = static_cast<DOG*>(ani1);
//dog1->OutPuttype();//错误,在ANIMAL类型指针不能调用方法OutPutType();在运行时出现错误。
//基类指针转为派生类指针,且该基类指针指向派生类对象
ANIMAL * ani3 = new DOG;
DOG* dog3 = static_cast<DOG*>(ani3);
dog3->OutPutname(); //正确
//子类指针转为派生类指针
DOG *dog2= new DOG;
ANIMAL *ani2 = static_cast<DOG*>(dog2);
ani2->OutPutname(); //正确,结果输出为大黄
//
system("pause");
}
|
● static_cast可以把任何类型的表达式转换成void类型。
● static_cast把任何类型的表达式转换成void类型。
● 另外,与const_cast相比,static_cast不能把换掉变量的const属性,也包括volitale或者__unaligned属性。
相关文章
- C++11 Lambda表达式
- 托管C++线程锁实现 c++11线程池
- C++11新特性(1) 右值引用
- 基于c++11新标准开发一个支持多线程高并发的网络库
- 88 C++ - 常用查找算法
- C++第11周项目3(5)——万以内回文素数
- C++第11周项目3(4)——万以内回文数
- C++第11周项目4——大奖赛计分
- C++第11周项目2(7)参考——都要学C
- C++第11周项目2(1)参考——百钱百鸡
- C02-程序设计基础提高班(C++)第11周上机任务-运算符重载
- 《C++程序设计教程(第3版)》——第3章,第1节传统的输入输出函数实现方法
- C++实现 (FFT)一维快速傅里叶变换
- C/C++中函数参数传递
- C/C++注册表【2】打开,创建,删除
- C++11中的noexcept说明符和操作符
- C++11(一):在类的定义时初始化非静态变量
- C++11 std::async 包装实体店::packaged_task
- 基于C++实现(控制台)学籍管理系统【100010507】
- C++ 在线编译器(支持 C++11)
- [第七届蓝桥杯省赛C++B组]交换瓶子
- C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People's Republic of China.936或者65001.)
- C++中的右值引用与移动构造
- C++ std::thread join() 与 detach 的理解
- 面向对象C++编程与实践考试题目
- C++ 实现2048小游戏