c++类型转换

如果两种类型可以相互转换,它们就是关联的。c++语言不会直接将两种不同类型的值相加,而是先根据类型转换规则及那个运算对象的类型统一后再求值。

1、隐式转换

隐式转换的类型转换是自动执行的,无须程序员介入。在下面的情况下,编译器会执行隐式转换:

  • 大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。
  • 条件表达式中,非布尔型转换成布尔型。
  • 初始化时,初始值变成变量类型。
  • 赋值语句中,右侧对象转换成左侧对象的类型。
  • 函数调用时发生的类型转换。

(1)算术转换

(1.1)整型提升

将小整数类型转换成较大的整数类型,对bool、char、signed char、unsigned char、short和unsigned short等类型来说,只要它们所有可能的值都存在int里,它们就会提升成int型,否则提升成unsigned int型;对较大的char类型(wchart_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的一种类型,前提是转换后的类型能容纳原类型所有可能的值。

(1.2)转换规则

算数转换将运算对象换成最宽的类型,比如表达式中既有整型又有浮点型,运算时会将整型变换成浮点型进行运算。算术运算首先执行整型提升,如果提升后的类型一致则不需要进一步的类型转换,否则要执行类型转换。如果运算对象符号一致,要么都是无符号的、要么都是有符号的,则小类型运算对象转换成较大类型。否则,符号不一致(含有无符号类型的)的运算则需要注意:

  • 无符号的类型不小于带符号类型的(无符号类型大),则带符号对象转换成无符号的。
  • 无符号类型小于带符号类型(无符号类型小),转换结果依赖机器:如果无符号类型的所有值都能存在该带符号类型中,则无符号对象转换成带符号类型,否则,带符号对象转换成无符号的类型。

(2)其他转换

  • 数组转换成指针

但当数组被用作decltype关键字的参数、取地址符(&)、sizeof、typeid等运算符的运算对象时,转换不会发生。

  • 函数类型自动转换成函数指针。
  • 算数类型或指针类型自动转换成布尔类型:

    char *cp=get_char();

    if(cp);//如果指针不是0,为真

    if(*cp);//如果指针指向的值不是空字符,为真

  • 非常量类型的指针(或引用)转换成常量类型:

    int i;

    const int &j=i;/非常量转换成常量的引用

    const int *p=&i;//非常量转换成指向常量的指针

  • 类类型定义的转换

  string s="a value";//字符串字面值转换成string类型

  while(cin>>s);//cin转换成bool值

如果构造函数只接受一个实参,那么它定义了此类类型的隐式转换机制,我们称这种构造函数为转换构造函数我们通过一个实参调用的构造函数定义一条从构造函数的参数类型向类类型转换的规则,需要多个实参的构造函数不能用隐式转换规则对只有一个实参的构造函数添加explicit声明可以阻止隐式转换,只能在类内声明构造函数时使用,在外部定义时不要重复关键字。所以使用explicit声明的构造函数时,只能以直接初始化的形式使用:

C c1("abc");//直接初始化

C c2="abc";//拷贝形式的初始化,会调用隐式的转换构造函数

2、显式转换

暂时不看

原文地址:https://www.cnblogs.com/StormWendy/p/8459391.html