C++——类型转换

简介: C++——类型转换

文章目录

类型转换

隐式类型转换

显式类型转换

C++兼容C中的强制类型转换

增加了四种操作符形式显式转换

小结(C++之父给C程序员建议)

代码示例


类型转换

隐式类型转换

char c = 'A';
  int i = c;//隐式
  -------------
  void func(int i){..}
  func(c);//隐式
  -------------
  int func(void){
    char c = 'A';
    return c;//隐式
  }


显式类型转换

C++兼容C中的强制类型转换

char c = 'A';
  int i = (int)c;//C风格强制转换
  int i = int(c);//C++风格强制转换


增加了四种操作符形式显式转换

  1. 静态类型转换
  1. 语法形式:
  2. 目标类型变量 = static_cast<目标类型>(源类型变量);
  3. 使用场景:
  4. //用于将void*转换为其它类型的指针
int a=100;
  void* pv = &a;
  int* pi = static_cast<int*>(pv);

  1. 动态类型转换
  2. dynamic_cast - 运行时类型检查。可以父子之间转换,也可以兄弟之间转换。优点是安全,缺点是运行时效率低。
  3. 常类型转换
  1. 语法形式:
  2. 目标类型变量 = const_cast<目标类型>(源类型变量);
  3. 使用场景:
  4. 用于去除一个指针或引用的常属性
  1. 重解释类型转换
  2. 语法形式:
  1. 目标类型变量 = reinterpret_cast<目标类型>(源类型变量);
  2. 使用场景:
  3. –》任意类型指针或引用之间转换
  4. –》在指针和整型数之间转换
  5. eg:向物理内存0x12345678存放数据123?
int* paddr = reinterpret_cast<int*>(0x12345678);
*paddr = 123;

小结(C++之父给C程序员建议)

  1. 慎用宏,使用const、inline、enum替换
#define PAI 3.14
--> const double PAI = 3.14;
#define max(a,b) ((a)>(b) ? (a):(b))
--> inline int max(int a,int b){
  return a>b ? a:b;
  }
#define STATE_SLEEP  0
#define STATE_RUN  1
#define STATE_STOP  2
--> enum STATE{SLEEP,RUN,STOP};

  1. 变量随用随声明同时初始化
  2. 尽量使用new/delete替换malloc/free
  3. 少用void*、指针计算、联合体和强制转换
  4. 尽量使用string表示字符串,少用C风格char*

代码示例

  • static_cast.cpp
#include <iostream>
using namespace std;
int main(void)
{
    int* pi = NULL;
    //char c = (long)pi;//C风格
    char c = long(pi);//C++风格
    void* pv = pi;
    //静态类型转换,合理:ok
    pi = static_cast<int*>(pv);
    //静态类型转换,不合理:error
    c = static_cast<long>(pi);
    return 0;
}


  • 执行结果

20200211215048863.png

  • const_cast.cpp
#include <iostream>
using namespace std;
int main(void)
{
    /* volatile修饰的变量表示"易变的",告诉
     * 编译器每次使用该变量时,都要从内存中
     * 去读取,而不要使用寄存器副本,防止编
     * 译器优化导致的错误结果*/
    const volatile int ci = 10;
    int* pci = const_cast<int*>(&ci);
    *pci = 20;
    cout << "ci=" << ci << endl;//20
    cout << "*pci=" << *pci << endl;//20
    cout << "&ci=" << (void*)&ci << endl;
    cout << "pci=" << pci << endl;
    return 0;
}


  • 执行结果

20200211215313612.png

  • reinterpret_cast.cpp
#include <iostream>
using namespace std;
int main(void)
{
    //"\000"->'\0'->0
    char buf[] = 
        "0001\00012345678\000123456";
    struct T{
        char type[5];
        char id[9];
        char passwd[7];
    };
    T* pt = reinterpret_cast<T*>(buf);
    cout << pt->type << endl;//0001
    cout << pt->id << endl;//12345678
    cout << pt->passwd << endl;//123456
    return 0;
}


  • 执行结果

20200211220033849.png

相关文章
|
6月前
|
安全 编译器 程序员
【C++】C++的类型转换
【C++】C++的类型转换
|
6月前
|
设计模式 安全 算法
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
【C/C++ 类型转换 】深入理解C++向上转型:从基础到应用
208 0
|
26天前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
17 1
|
27天前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
26 3
|
27天前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
43 3
|
6月前
|
存储 安全 编译器
C++:现代类型转换
C++:现代类型转换
46 5
|
26天前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
19 0
|
4月前
|
存储 安全 编译器
【C++11】类型转换
【C++11】类型转换
21 0
|
4月前
|
安全 程序员 编译器
C++一分钟之-C++中的类型转换
【7月更文挑战第8天】C++中的类型转换涉及隐式和显式操作,隐式转换如从`int`到`double`是自动的,但可能导致数据丢失。显式转换包括`static_cast`, `dynamic_cast`, `const_cast`, `reinterpret_cast`,以及转换构造函数。要避免数据丢失、类型不匹配和运行时错误,需谨慎使用显式转换并检查结果。过度使用`reinterpret_cast`应避免。理解这些转换有助于编写更安全的代码。
34 0
|
6月前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
51 5