所以类型转换,就是为了告诉编译器这部分内存,应该用什么方式去解释它,如何组织这段内存。

1、C风格类型转换

c语言比较熟悉,指针类型的转换很常见。通过圆括号和标识符组成(type) expression。允许任何类型之间的转换过于粗鲁并且在程序语句中难以识别(主要是人工阅读代码可能难以分辨而已,因为C++语法复杂)。所以c++定义了四种类型转换,解决上述缺点。

2、C++风格类型转换

使用格式cast-name<type>(expression)
1、 static_cast
  功能上基本和C风格类型转换一样,含义也相同,但是不能从表达式中去除const属性。

voidf *p;
double *dp = static_cast<double *>(p); 

2、const_cast
  类型转换掉表达式的const属性,将常量对象转换成非常量对象的行为,此时编译器不会阻止用户对该对象写操作。

const  char *p;
char *q = const_cast<char *>(p);//正确
char *pq = static_cast<char *>(p);//错误,只可通过const_cast转换

3、dynamic_cast
  运行时类型识别,被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)。它不能被用于缺乏虚函数的类型上,也不能用它来转换掉常量属性。

class Widget{};//内部含有虚函数
class SpecialWidget:public Widget{};
Widget *pw = new SpecialWidget;
SpecialWidget *psw = dynamic_cast<SpecialWidget *>(pw);//成立

4、reinterpret_cast
  通常用于函数指针之间的转换,这种转换代码移植性很差,最好不使用。

typedef void (*FUNPTR)();//函数指针类型
int doSometing();
FUNPTR funcptr = reinterpret_cast<FUNPTR>(doSometing);//这种转换可以通过编译器,但是我们为什么需要这种垃圾转换了,除非非常理解底层结构。

2、类型转换函数

当类型不匹配的时候,C++编译器通常会进行相应的类型转换。

  1. 内置类型隐式转换
    如c++支持char隐式转换成int,short隐式转换double等,这些都是语言特性造成,不受我们控制无法改变。
  2. 自定义类
    当类型不匹配时,编译器也会首先考虑隐式转换但是需要调用对应的转换函数。C++规定两种函数可以作为隐式的类型转换函数:单参数构造函数和隐式类型转换运算符。

单参数构造函数:是指只用一个参数即可以调用的构造函数。该函数可以是只定义了一个参数,也可以是虽然定义了多个参数但第一个参数以后的所有参数都有缺省值。总之,编译器需要调用对应的函数。

class Name {
public:Name(const string& s);
};
void Display(Name a);
string s("Hello Name");
Display(s);//这里会进行隐式转换,通过Name构造函数生成临时对象,传递进去。

隐式类型转换运算符:也是一个函数。operator type()

class Rational {
public:
operator double() const; //类型转换运算符,转换Rational类成double
};
Rational r(1,2);
double d = 0.5*r;//编译器自动调用使r转换成double

3、避免定义类型转换函数

可能当你在不需要使用转换函数时,这些的函数却会被编译器调用运行。结果这些不正确的程序会出现问题而又无法判断出原因。

1、首先解决类型转换运算符
  用不使用语法关键字的等同的函数来替代转换运算符,明确调用对应的函数,而避免编译器自动调用。库函数中的string类型没有包括隐式地从string转换成C风格的char*的功能,而是定义了一个成员函数c_str用来完成这个转换。
2、解决通过单参数构造函数进行隐式类型转换
  C++编译器支持explicit关键字,禁止编译器自动调用相应的构造函数进行隐式转换。暂时理解这个方法即可,其他其淫无比的技巧放放吧。

template<class T>//模板数组
class Array {
public:Array(int lowBound, int highBound);//不可做隐式转换函数Array(int size);//数组维度,可做隐式转换函数T& operator[](int index);bool operator==( const Array<int>& lhs,const Array<int>& rhs);
};Array<int> a(10),b(10);if(a == b[i])
{}
/*
因为隐式转换,出现大问题。b[i]是int类型,a是Array<int>类型。然后调用operator==函数。于是编译器通过构造函数将int转换成Array<int>临时对象,产生错误,致命bug。
通过explicit关键字声明构造函数,那么这里编译器就会报错,而不会通过。
*/

类型转换及类型转换函数相关推荐

  1. C++:16---强制类型转换和类型转换

    旧式的强制类型转换 在早期C/C++中,显式地进行强制类型的转换有以下两种形式: type (expr) ;        //函数形式的强制类型转换 (type) expr;        //C语 ...

  2. 【C++基础语法 2】——类型转换[自动类型转换/强制类型转换]

    2. 类型转换 2.1 C++转换方式 自动类型转换(隐式转换):遵循一定的规则,由编译系统自动完成 强制类型转换:把表达式的运算结果强制转换成所需的数据类型 C++自动执行很多类型的转换: 将一种算 ...

  3. 基本数据类型转换 || 自动类型转换与强制类型转换

    基本数据类型转换 自动类型转换 强制类型转换

  4. C语言数据类型转换(自动类型转换 强制类型转换)

    数据类型转换就是将数据(变量.数值.表达式的结果等)从一种类型转换为另一种类型. 自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. ...

  5. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

  6. C语言数据类型转换(自动类型转换+强制类型转换)

    自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. 1)将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如 floa ...

  7. Python类型转换——数据类型转换函数大全

    Python类型转换--Python数据类型转换函数大全 虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型 ...

  8. hive函数大全(数学函数,集合函数,类型转换,日期函数,条件函数,字符串函数,及侧视图)

    在hive中,可以使用以下命令查看某个函数的用法: desc function extended 函数名字; 比如查函数date_add函数的用法: desc function extended da ...

  9. 【Python】类型转换:float()函数

    先导知识 代码 print('-------------float()将其他数据类型转换成float类型---------------') s1 = '32.36' s2 = '85' s3 = Tr ...

最新文章

  1. 【Java】从键盘输入字符串和数字
  2. Java6和Java8在Windows上共存,(任意JDK共存,博主实现了789切换)
  3. CheckBoxList控件绑定数据和设置选定项
  4. gstreamer向appsrc发送编码数据的代码
  5. 二进制、八进制、十进制与十六进制的转换大全
  6. 池建强 博客 Mac使用技巧 第一季
  7. 使用jupyter做数据分析与挖掘
  8. 文献管理者ReferenceManager开发及使用
  9. 好心情:吃精神科药物药不见效?你可能忽视了血药浓度
  10. 神仙道人物属性基础知识普及
  11. mvn上传pom/jar至Nexus私服
  12. php7.2 webshell,phpStudy后门分析
  13. 出现 Cannot read property 'xxxxxx' of null 问题思路
  14. Shell编程中的数组定义、遍历
  15. GitHub狂飙30K+star面试现场,专为程序员面试打造,现已开源可下载
  16. 是什么让复旦校长彻夜难眠?
  17. PHP生成唯一邀请码
  18. 计算机系统导论与计算机导论,计算机系统导论之学习心得.doc
  19. 毕业一年,回顾一下自己与刚毕业的变化
  20. 2019AutoCAD经典模式 设置步骤

热门文章

  1. t检验该怎么分析?如果选择哪种t检验?
  2. ToggleButton的用法
  3. Python 安装PyQt5失败:Permission denied:d3dcompiler_47.dll
  4. 2022 年顶级商业和 IT 认证课程,让你获得职业信誉,提升竞争力
  5. php微信当面付,微信当面付(c#源码)
  6. 支付宝当面付php接入源码下载,支付宝当面付(扫码支付)实例源码下载(官方)
  7. 2022山东理工大学pta程序设计---实验七(函数)题解
  8. 台式计算机除尘方法,一种计算机主机箱除尘装置及其工作方法与流程
  9. css 优惠券样式大全
  10. fatal: could not create work tree dir ‘xxx’: Permission denied解决办法