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

目录
相关文章
|
7月前
|
C语言 C++
C++与C强转异同(下)
C++与C强转异同(下)
74 0
|
程序员 编译器 C语言
C++风格与C风格类型强转异同
C++风格的强转: C++强制类型转换 C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下: 目标类型 b = (目标类型) a; C++也是支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。 在C++中,新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的强制类型转换。 C++风格的强制类型转换能更清晰的表明它们要干什么,程序员只要看一眼这样的代码,立即
121 0
|
7月前
|
算法 程序员 编译器
C++与C的对比:理解两者之间的异同与选择
C和C++是两种广泛使用的编程语言,都提供底层访问能力和指针操作,适合高效底层编程。C++是面向对象的,支持类和对象,提供异常处理、丰富的标准库和更强的类型系统;而C语言面向过程,无内置异常处理,标准库较简单,编译速度快。选择使用哪种语言应考虑项目需求、团队熟悉度和性能要求。C++常用于游戏开发、桌面应用和高性能场景;C则在系统级编程、嵌入式系统和性能敏感应用中占优。
|
7月前
|
存储 缓存 安全
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
164 0
|
编译器 C语言 C++
【四、const与this指针详解】详解C与C++中const的异同,类中的const
【四、const与this指针详解】详解C与C++中const的异同,类中的const
124 0
|
29天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
51 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
91 4