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

简介: C++与C强转异同(下)

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

四种强转详解:

C++的类型转换只是语法上的解释,本质上与C风格的类型转换没什么不同,C语言做不到事情的C++也做不到。

语法:

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

static_cast

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

除了语法不同,C和C++没有区别。

#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    int    ii = 3;
    long ll = ii;                     // 绝对安全,可以隐式转换,不会出现警告。
    double dd = 1.23;
    long ll1 = dd;                  // 可以隐式转换,但是,会出现可能丢失数据的警告。
    long ll2 = (long)dd;              // C风格:显式转换,不会出现警告。
    long ll3 = static_cast<long>(dd);    // C++风格:显式转换,不会出现警告。
    cout << "ll1=" << ll1 << ",ll2=" << ll2 << ",ll3=" << ll3 << endl;
}
用于指针之间的转换

C风格可以把不同类型的指针进行转换。

C++不可以,需要借助void *。

#include <iostream>
using namespace std;
void func(void* ptr) {   // 其它类型指针 -> void *指针 -> 其它类型指针
   double* pp = static_cast<double*>(ptr);
}
int main(int argc, char* argv[])
{
    int ii = 10;
    double* pd1 = &ii;                          // 错误,不能隐式转换。
    double* pd2 = (double*)&ii;                 // C风格,强制转换。
    double* pd3 = static_cast<double*>(&ii);    // 错误,static_cast不支持不同类型指针的转换。
    void* pv = &ii;                             // 任何类型的指针都可以隐式转换成void*。
    double* pd4 = static_cast<double*>(pv);     // static_cast可以把void *转换成其它类型的指针。
    func(&ii);

const_cast

static_cast不能丢掉指针(引用)的const和volitale属性,const_cast可以。

示例:

#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  int num = 4;
  const int* aa = &num;
  int* bb = (int*)aa;                  // C风格,强制转换,丢掉const限定符。
  int* cc = const_cast<int*>(aa);      // C++风格,强制转换,丢掉const限定符。
  *bb = 6;
  cout << *bb << endl;
  cout << *cc << endl;
}
输出:

6 6

三、reinterpret_cast

static_cast不能用于转换不同类型的指针(引用)(不考虑有继承关系的情况),reinterpret_cast可以。

reinterpret_cast的意思是重新解释,能够将一种对象类型转换为另一种,不管它们是否有关系。

语法:reinterpret_cast<目标类型>(表达式);

<目标类型>和(表达式)中必须有一个是指针(引用)类型。

reinterpret_cast不能丢掉(表达式)的const或volitale属性。

应用场景:

reinterpret_cast的第一种用途是改变指针(引用)的类型。

reinterpret_cast的第二种用途是将指针(引用)转换成整型变量。整型与指针占用的字节数必须一致,否则会出现警告,转换可能损失精度。

reinterpret_cast的第三种用途是将一个整型变量转换成指针(引用)。

示例:

#include <iostream>
using namespace std;
void func(void* ptr) {  
  long long ii = reinterpret_cast<long long>(ptr);
  cout << "ii=" << ii << endl;
}
int main(int argc, char* argv[])
{
  long long ii = 10;
  func(reinterpret_cast<void *>(ii));
}
输出:

4 4

完结撒花(注本文章部分采用慕课往的C++基础课的文档)

目录
相关文章
|
3月前
|
编译器 程序员 C++
C++与C强转异同(上)
C++与C强转异同
53 0
|
4月前
|
程序员 编译器 C语言
C++风格与C风格类型强转异同
C++风格的强转: C++强制类型转换 C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下: 目标类型 b = (目标类型) a; C++也是支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。 在C++中,新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的强制类型转换。 C++风格的强制类型转换能更清晰的表明它们要干什么,程序员只要看一眼这样的代码,立即
61 0
|
1月前
|
存储 缓存 安全
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
15 0
|
编译器 C语言 C++
【四、const与this指针详解】详解C与C++中const的异同,类中的const
【四、const与this指针详解】详解C与C++中const的异同,类中的const
87 0
|
24天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
32 0
|
2天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
4天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”