C++ 11 强制类型转换 北京大学程序实习公开课
来源:互联网 发布:夏易网络 编辑:程序博客网 时间:2024/06/05 08:51
类型转换是有风险的:
1、浮点型转换成整型就会造成精度损失,在数值计算中,要非常小心,对精度非常有要求。
2、基类指针转换成派生类指针风险非常大。
以前类型转换,就直接用int(a),double(b)等方式。
这种方式不区分类型转换的风险,并且有些bug是类型转换引起的,如果显示的来进行强制类型转换,可以方便bug排查。比如基类和派生类的转换风险很大,用B*(A)就非常不合适,但用关键字进行强制类型转换,就可以用查找的方式在程序中找到不同风险级别的转换。
#include <iostream>#include<vector>#include<string>using namespace std;class A {public:operator int() {return 1;}operator char*() {return NULL;}};int main() { A a; int n; char* p = "New Dragon INN"; n = static_cast<int>(3.14);//n的值变为3 n = static_cast<int>(a);//调用a.operator int,n的值变为1 p = static_cast<char*>(a); //调用a.operator char*,p的值变为NULL //n = static_cast<int> (p);//编译错误,不能将指针转换成整型 //p = static_cast<char*>(n);//不能将整型转换成指针 return 0;}
用来进行去除const属性的转换。将const引用转换成同类型的非const引用,将const指针转换成同类型的非const指针时用它。
#include <iostream>#include<vector>#include<string>using namespace std;class A {public:operator int() {return 1;}operator char*() {return NULL;}};int main() { const string s = "Inception"; string& p = const_cast<string&>(s); string* ps = const_cast<string*>(&s);//&s的类型是const strinf* return 0;}
3、dynamic_cast:
基类指针转换成派生类指针时有风险的,如果基类指针确实指向派生类指针,那么转换是安全的,如果基类指针原来指向的是基类指针,那么转换是不安全的。dynamic_cast仅适用于多态基类的类型转换。
#include <iostream>#include<vector>#include<string>using namespace std;class Base {//有虚函数,因此是多态基类public:virtual ~Base() {}}; class Derived:public Base {};int main() { Base b; Derived d; Derived* pd; pd = dynamic_cast<Derived*>(&b); //此处是不安全的转换 if(pd == NULL) cout<<"unsafe cast 1"<<endl; Base* pb = &d; pd = dynamic_cast<Derived*>(pb); //安全的转换 if(pd == NULL) cout<<"unsafe cast 2"<<endl; return 0;}
原理说明:
派生类指针指向基类对象或派生类对象,其实指针的值是一样的,只是类型说明不一样,多态基类,与派生类的区别,指针的开头都指向虚函数表,所以,dynamic_cast可以根据虚函数表,确定是基类还是派生类,一般的基类和派生类无虚函数表,所以dynamic_cast工作不了。
0 0
- C++ 11 强制类型转换 北京大学程序实习公开课
- c++ 11 异常处理 北京大学C++程序设计实习公开课
- c++-----强制类型转换
- 【C++】强制类型转换
- C 强制类型转换
- C 强制类型转换
- C 强制类型转换
- C/C++强制类型转换。。。
- c/c++强制类型转换
- C语言类型强制转换
- c/c++强制类型转换
- C语言强制类型转换
- C中的类型强制转换
- c/c++强制类型转换
- C语言类型强制转换
- C/C++类型强制转换
- C语言强制类型转换
- C指针强制类型转换
- MYSQL修改列的基础语句
- 作業系統之前的程式 for stm32f4 - discovery (0.2) - p103 模擬器
- AFNetworking 3.0迁移指南
- android studio 打包webview 5.0文件上传问题
- 第6周项目5 后缀表达式
- C++ 11 强制类型转换 北京大学程序实习公开课
- 九度OJ 1099:后缀子串排序 (排序)
- 阿拉伯数字转换成英文大写币别(格式化逗号分隔符后传入)
- android ListViewA-Z字母索引
- LeetCode48——Rotate Image
- CSS旋转图片
- 使用cardview和recycleview时碰到的一些问题
- 冒泡排序
- *LeetCode-Nim Game