C++基础06---类型转换

1. 隐式类型转换

系统自动进行,无需开发人员介入。

int main() {
    int m = 3.14 + 5;
    cout << m << endl;  //8, 系统自动隐式类型转换,将8.14小数部分截断
}

2.显示类型转换(强制类型转换)

2.1 C语言风格的强制类型转换
int main() {
    //int k = 5 % 3.2; //错误,%两侧须为整型
    int k = 5 % (int)3.8;  //2
    int k2 = 5 % int(3.8);
    cout << k << endl;
    cout << k2 << endl;
}
2.1.2 C++的强制类型转换

通用形式:
强制类型转换名(express)
type:转换的目标类型
express:需要转换的变量

2.1.2.1 static_cast:

静态转换,编译时就会进行类型转换,类似于c语言中的强制类型转换。
应用场景:
(a)相关类型转换,如整型与实型的转换

int main() {
    double a = 3.14;
    int b = static_cast<int>(a);
    cout << b; //3
}

(b)类中子类对象转成父类对象

class A{};
class B : public A{};

int main() {
    A a;  //父类对象
    B b;  //子类对象
    A a2 = static_cast<A>(b);  //子类对象转换为父类对象
//    B b2 = static_cast<B>(a); //错误,父类对象无法转换为子类对象
    
}

(c)void* 与其他类型指针之间的转换
void* :无类型指针,可以指向任何类型(万能指针)
不可用于不同类型指针间的转换如int转float/double*

int main() {
    int i = 10;
    int *p = &i;
    void *p1 = static_cast<void*>(p); //将int*指针p转换为void*
    int *p2 = static_cast<int*>(p1); //将void*指针p1转换为int*
    // double p3 = static_cast<double>(p1);  //错误,p1由int*转换为void*,不可转为double*
}
2.1.2.2 dynamic_cast:

运行时进行类型转换,主要用于父类型和子类型之间转换(多态)

2.1.2.3 const_cast:

编译时就会进行类型转换
用于去除指针或者引用的const属性
(1) 去除指针类型的const

int main() {
    int a = 10;
    const int *p = &a;
    // *p = 2; //错误,指针p的属性为const类型,其指向元素无法修改
    int *p1 = const_cast<int *>(p); //将const int* 转换为int *
    *p1 = 2; //可以修改p1指向的元素
    cout << *p1 << endl;  //2
    cout << a << endl; //2
}

(2) 去除引用类型的const

int main() {
    int a = 5;
    const int &p = a;
//    p = 10; //错误, 引用p的属性为const类型,无法修改p的值
    int p1 = const_cast<int &>(p); // const int &转换为int &
    p1 = 10;
    cout << p1 << endl;  //10
    cout << p << endl;  //5
}

(3)无法去除非指针/引用类型的const

int main() {
    const int a = 5;
//    int b = const_cast<int>(a); //错误,const_cast无法转换非指针和引用类型
}
2.1.2.4 reinterpret_cast:

编译时就会进行类型转换
reinterpret:重新解释,能够将操作数内容解释为另一种不同类型。可以随意转换类型。
(1)将地址转换为指针

int main() {
    int a = 10;
    int *p1 = reinterpret_cast<int *>(&a);  //将a的地址转换为指针
}

(2)不同类型的指针之间进行转换,将int* 指针转换为char*

int main() {
    int a = 10;
    int *p1 = &a;
    char *p2 = reinterpret_cast<char *>(p1); //将int* 指针转换为char*
}

(3)将int* 指针转换为整型

int main() {
    int a = 10;
    int *p1 = &a;
    int b = reinterpret_cast<long long>(p1);//将int* 指针转换为整型
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值