C++与C强转异同(上)

简介: C++与C强转异同

C风格的强转:

隐式转换(编译器自动转换)

会出现警告,精度丢失

代码:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    char cc = 'X';
    float ff = cc;    // 隐式转换,不会告警。
    double dd = 3.38;
    long ll = dd;    // 隐式转换,会告警。。
}
输出:

强制类型转换

不会出现警告,精度丢失一样存在

代码:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    char cc = 'X';
    float ffc = static_cast<float>(cc);  // 显式地使用static_cast进行强制类型转换,不会告警。
    double dd = 3.38;
    long llc = static_cast<long>(dd);  // 显式地使用static_cast进行强制类型转换,不会告警。
    int a = int(dd);
}
输出:

C++风格的强转:

C++强制类型转换

C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下:

目标类型 b = (目标类型) a;

C++也是支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。

在C++中,新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的强制类型转换。

C++风格的强制类型转换能更清晰的表明它们要干什么,程序员只要看一眼这样的代码,立即能知道强制转换的目的,并且,在多态场景也只能使用C++风格的强制类型转换。

一、static_cast

static_cast是最常用的C++风格的强制类型转换,主要是为了执行那些较为合理的强制类型转换,使用格式如下:

static_cast<目标类型>(表达式);

用于基本内置数据类型之间的转换

C风格:编译器可能会提示警告信息。

static_cast:不会提示警告信息。

#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char cc = 'X';
float ff = cc;     // 隐式转换,不会告警。
float ffc = static_cast<float>(cc);  // 显式地使用static_cast进行强制类型转换,不会告警。
double dd = 3.38;
long ll = dd;    // 隐式转换,会告警。
long llc = static_cast<long>(dd);  // 显式地使用static_cast进行强制类型转换,不会告警。
}

用于指针之间的转换

C风格:可用于各种类型指针之间的转换。

static_cast:各种类型指针之间的不允许转换,必须借助void*类型作为中间介质。

#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  int type_int = 10;
  float* float_ptr1 = (float*)&type_int; //C风格直接强转
  cout << "C风格" << "*float_ptr1 = " << *float_ptr1 << endl;
  // float* char_ptr2 = static_cast<float*>(&type_int); // int* -> char* 使用static_cast转换无效
  void* void_ptr = &type_int; // 任何指针都可以隐式转换为void*
  float* float_ptr4 = static_cast<float*>(void_ptr); // void* -> float* 使用static_cast转换成功
  cout << "C++风格" << "*float_ptr4 = " << *float_ptr4 << endl;
}

转换之后的数据是不精确的

不能转换掉expression的const或volitale属性

#include <iostream>
int main(int argc, char* argv[])
{
int temp = 10;
const int* a_const_ptr = &temp;
int* b_const_ptr = static_cast<int*>(a_const_ptr); // const int* -> int* 无效
const int a_const_ref = 10;
int& b_const_ref = static_cast<int&>(a_const_ref); // const int& -> int& 无效
volatile int* a_vol_ptr = &temp;
int* b_vol_ptr = static_cast<int*>(a_vol_ptr); // volatile int* -> int* 无效
volatile int a_vol_ref = 10;
int& b_vol_ref = static_cast<int&>(a_vol_ref); // volatile int& -> int& 无效
}

C++与C强转异同(下)https://developer.aliyun.com/article/1429076

目录
相关文章
|
4月前
|
C语言 C++
C++与C强转异同(下)
C++与C强转异同(下)
62 0
|
9月前
|
程序员 编译器 C语言
C++风格与C风格类型强转异同
C++风格的强转: C++强制类型转换 C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下: 目标类型 b = (目标类型) a; C++也是支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。 在C++中,新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的强制类型转换。 C++风格的强制类型转换能更清晰的表明它们要干什么,程序员只要看一眼这样的代码,立即
97 0
|
4月前
|
算法 程序员 编译器
C++与C的对比:理解两者之间的异同与选择
C和C++是两种广泛使用的编程语言,都提供底层访问能力和指针操作,适合高效底层编程。C++是面向对象的,支持类和对象,提供异常处理、丰富的标准库和更强的类型系统;而C语言面向过程,无内置异常处理,标准库较简单,编译速度快。选择使用哪种语言应考虑项目需求、团队熟悉度和性能要求。C++常用于游戏开发、桌面应用和高性能场景;C则在系统级编程、嵌入式系统和性能敏感应用中占优。
|
4月前
|
存储 缓存 安全
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
95 0
|
编译器 C语言 C++
【四、const与this指针详解】详解C与C++中const的异同,类中的const
【四、const与this指针详解】详解C与C++中const的异同,类中的const
104 0
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
31 0
|
14天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
14天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。