C++:类型转换

本文详细介绍了 C++ 的四种类型转换。静态类型转换支持内置数值及继承类中父子指针或引用转换;动态类型转换不支持内置数值转换,更安全;常量转换用于修改类型的 const 属性;重新解释转换可在不同数据类型间转换,但极不安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++:类型转换

 一、静态类型转换(static_cast)

主要用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换

语法:static_cast<target_type>(source object)

1、支持内置数值类型间的转换

#include <iostream>
using namespace std;

int main()
{
	char a = 'a';
	double b = (double) a;
	// 支持内置数值类型间的转换
	// 语法:static_cast<target_type>(source object)
	double c = static_cast<double>(a);
	cout<<b<<endl;
	cout<<c<<endl;
    
    return 0;
}

2、支持继承类中父子指针或引用间相互转换.

3、无继承关系的类之间不支持转换

#include <iostream>
using namespace std;

class Base{};
class Son: public Base{};
class Other{};

int main()
{
    Base* base = NULL;
    Son* son = NULL;
    Other* other = NULL;
    
    // a、父转子 向下类型转换,static_cast 支持,但不安全
    son = static_cast<Son>(base);

    // b、子转父 向上类型转换,static_cast 支持,安全
    base = static_cast<Base>(son);

    // c、无继承关系的类之间不可以转换
    // son = static_cast<Son> other;

    return 0;
}

 二、动态类型转换(dynamic_cast)

主要用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换

语法:dynamic_cast<target_type>(source object)

1、不支持内置数值类型间的转换

#include <iostream>
using namespace std;

int main()
{
    char a = 'a';
    // 不支持内置数值类型间的转换
    // double c = dynamic_cast<double>(a);
    
    return 0;
}

2、支持继承类中父子指针或引用间相互转换.

3、若存在潜在数据丢失,转换均不允许,因此比静态类型转换更安全。

#include <iostream>
using namespace std;

class Base{};
class Son: public Base{};
class Other{};

int main()
{
	Base* base = NULL;
	Son* son = NULL;
	//1、将base转为Son* 父转子,向下转换,不安全。
    //2、若发生了多态,转换总是安全的,转换成功;否则不支持向下转换
	//son = dynamic_cast<Son*>(base); // 转换不成功
	
	//3、将son转为Base* 子转父,向上转换,安全。
	base = dynamic_cast<Base*>(son); // 转换成功
	
	//4、将son转换为Other*
	// Other* other = dynamic_cast<Other*>(son); // 转换不成功

    return 0;
}

三、常量转换(const_cast)

该运算符主要用来修改类型的const属性

语法:const_cast<target_type>(source object)

1、常量指针转换为非常量指针,并且仍指向原对象;

2、常量引用转换为非常量引用,并且仍指向原对象;

3、注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除其const 属性。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

int main()
{
    int* var01 = NULL;
    
    // 1、将非常量指针转换为常量指针
    const int* var02 = const_cast<const int*>(var01);

    // 2、将常量指针转换为非常量指针
    int* var03 = const_cast<int*>(var02)

    // 3、不可对非指针和非引用变量进行const_cast转换
    int a = 10;
    // const int b = const_cast<const int>(a);

    int& var04 = a;

    // 4、将非常量引用转换为常量引用
    const int& var05 = const_cast<const int&>(var04);
    
    // 5、将常量引用转换为非常量引用
    int& var06 = const_cast<int&>(var05);

    system("pause");
    return 0;
}

四、重新解释转换(reinterpret_cast)

主要用于将一种数据类型从一种类型转换为另一种类型。可将一个指针转换为一个整数,亦可将一个整数转换为一个指针

语法:reinterpret_cast<target_type>(source object)

该类型转换极不安全,不推荐使用

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值