C++中4种类型转换方式

C++中4种类型转换方式

首先类型转换,比如以下代码

int i;
double d = 12.0;
i = (int)d;

但是这种强制转换符对于类和类的指针来说,就比较麻烦,所以C++标准定义了四个新的转换符:

  • reinterpret_cast
  • static_cast
  • dynamic_cast
  • const_cast

reinterpret_cast

转换一个指针为其他类型的指针,也允许一个指针转换为整数类型,反之亦然

#include <iostream>
using namespace std;

class A {
public:
    void hello() { cout << "this is a" << endl; }
};

class B {
public:
    void hello() { cout << "this is b" << endl; }
};

int main() {
    A* a = new A;
    a->hello();
    B* b = reinterpret_cast<B *>(a);
    b->hello();
    int c = reinterpret_cast<int>(a);
    cout << a << endl;
    cout << c << endl;
    system("pause");
}

运行结果如下:

这里写图片描述

static_cast

允许任意的隐式转换和相反转换动作(即使它是不允许隐式的),比如类上,它允许这样两个操作:(1)子类类型的指针转换为父类类型的指针(这个是有效的隐式转换),(2)转换父类的指针为子类指针(隐式操作是不允许的),当然也可以用在基础类型转换上,这里与dynamic_cast做对比

#include <iostream>
using namespace std;

class A {
public:
    void hello() { cout << "this is a" << endl; }
};

class B:public A {
public:
    void hello() { cout << "this is b" << endl; }
};

int main() {
    A* a = new A;
    B* b = new B;
    //子类转换成父类
    A* a1 = static_cast<A *>(b);
    a1->hello();
    //父类转换成子类
    B* b1 = static_cast<B *>(a);
    b1->hello();
    system("pause");
}

结果如下:

这里写图片描述

dynamic_cast

只能用于对象的指针和引用,用于多态的时候允许任意的隐式类型以及反转过程(它这里与static_cast不同的地方就值,在反转过程的时候会检查操作是否有效,无效返回NULL),具体代码如下:

#include <iostream>
using namespace std;

class A {
public:
    virtual void hello() { cout << "this is a" << endl; }
};

class B:public A {
public:
    void hello() { cout << "this is b" << endl; }
};

int main() {
    A* a1 = new A;
    A* a2 = new B;
    B* b1 = dynamic_cast<B *>(a1);
    B* b2 = dynamic_cast<B *>(a2);
    if (b1 != NULL) {
        cout << "this is b1" << endl;
        b1->hello();
    }
    if (b2 != NULL) {
        cout << "this is b2" << endl;
        b2->hello();
    }
    system("pause");
}

在实现的过程中,发现如果类没有包含多态类型会报错

这里写图片描述

const_cast

说这个之前先说一下const对象的指针问题

const int* p;
int a = 10;
p = &a;
//*p = 20;  不允许
a = 20;

这里说的是p本身可以修改,但是p指向的内容不能通过p来修改

int c=20;
int *const p=&c;

而这样定义,则是p本身是const,指向的内容可以修改。

简单一句话来说,const在*后面就是指针本身是const,const在*前面就是指向的内容不允许通过指针修改

而const_cast就是改变这个性质,代码如下

#include <iostream>
using namespace std;

class A {
public:
    A(int num) {
        aa = num;
    }
    void hello() { cout << "this is a" << endl; }
    int aa;
};

int main() {
    const A* a = new A(5);
    cout << a->aa << endl;
    //a->aa = 20;  不允许
    //A* a1 = a;  const A* 类型不允许初始化A*
    A* a2 = const_cast<A*>(a);
    a2->aa = 30;
    cout << a->aa << endl;
    system("pause");
}

运行结果

这里写图片描述

C++,有多类型转换的方法和技巧。以下是一些常见的类型转换: 1. **显式类型转换**:这是最直接的类型转换方式,通过使用类型转换操作符来明确地告诉编译器你想要将某类型的值转换为另一类型。例如,你可以使用`static_cast<T>`将一类型的值转换为另一类型。 ```cpp int i = 10; double d = static_cast<double>(i); // 将int转换为double ``` 2. **函数返回值转换**:在C++,当你调用一个函数并希望它返回一个与你的变量类型不同的值时,你可能会遇到类型转换的问题。在这情况下,你可以使用类型转换来确保函数返回正确的类型。 ```cpp int i = someFunction(); // someFunction返回一个double i = static_cast<int>(someFunction()); // 将返回值转换为int ``` 3. **模板和类型萃取**:C++的模板和类型萃取功能可以让你在编译时进行类型转换。这通常用于处理泛型编程和类型安全。 4. **自动类型转换**:在某些情况下,C++编译器会自动进行类型转换。例如,当你使用算术运算符(如加号`+`)时,编译器会尝试将操作数转换为可以执行该运算的最宽类型。 5. **构造函数**:构造函数允许你创建一个特定类型的对象,并将一个值作为参数传递给它。这可以用于将一个值转换为另一类型的对象。 6. **转换构造函数**:这是另一类型的构造函数,它允许你将一个类型的值转换为另一个类型的对象。这通常用于将一数据结构(如字符串)转换为另一数据结构(如整数数组)。 7. **智能指针**:在C++,智能指针是一个特殊类型的指针,它们在自动管理内存方面非常有用。当使用智能指针时,通常需要将它们显式转换为原始指针,以便可以使用普通指针的运算符和函数。 这些是在C++进行类型转换的一些常见方法。但是,你应该始终确保你理解每个类型转换的潜在风险和后果,尤其是在涉及到安全敏感的数据时。在C++处理类型转换的最佳实践是遵循明确的代码规则和遵循最佳实践指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值