c++的类型转换

以下整理狄泰唐老师课程,感兴趣淘宝店铺搜索狄泰软件

基本类型的类型转换

熟悉c/c++语言的都知道,在普通类型之间存在着隐士和显示的类型转换
按照下图的优先级顺序:

c++的类型转换
char 和 short 进行一起运算比如相加,都会被先隐士转化为int然后运行,因为int是最高效的

基本类型和类类型进行转换

基本类型想和类类型之间进行转换就要使用类型转换构造函数
先看一个例子
#include <iostream>
using namespace std;

class Test{
public:
    Test(int i) {
        std::cout << "Test(int i)" << std::endl;
    }
};

int main()
{
    Test a(1); //调用 Test(int i)构造函数进行创建a的类变量
    Test a = 1;//和上述结果相同同样是Test(int i)

    return 0;
}
不知道刚开始遇到这种的时候大家怎么想的,我挺蒙的,怎么基本类型赋值给类类型还能通过?
原因是定义了转换构造函数,定义:
有且仅有一个参数
参数是基本类型
参数是其他类型

想一下c语言的 int i;
试一下 i = int(10);也是可以的
对于Test a;
a = 100; 也是可以编译通过的!!!
#include <iostream>
using namespace std;

class Test{
public:
    Test(int i) {
        std::cout << "Test(int i)" << std::endl;
    }
    Test() {
        std::cout << "Test()" << std::endl;
    }
    Test& operator =(const Test& a) {
        std::cout << "operator =(const Test& a)" << std::endl;
    }

};

int main()
{
    Test a(1); //调用 Test(int i)构造函数进行创建a的类变量
    Test a1;//和上述结果相同同样是Test(int i)
    a1 = 10;//调用了Test(int i)生成了匿名的临时对象,然后调用Test& operator =(const Test& a)

    return 0;
}

当a1 = 10;的时候int怎么能给类类型赋值呢,然后编译器看有没有转换构造函数,一看,有,然后就构造了一个Test(1)的匿名临时对象,接着调用了赋值操作符函数,这里说一点c++的匿名对象都是const的,所以如果你把上面的改为Test& operator =(Test& a)就无法通过,因为const不能给一个非const,小作用域不给大作用域
编译器这里尽力的使用隐士类型转换让我们不产生错误,但是这种隐士是非常危险的,可能带来意想不到的错误

使用explicit来禁止编译器的转换尝试

#include <iostream>
using namespace std;

class Test{
public:
    explicit Test(int i) {
        std::cout << "Test(int i)" << std::endl;
    }
    Test() {
        std::cout << "Test()" << std::endl;
    }
    Test& operator =(const Test& a) {
        std::cout << "operator =(const Test& a)" << std::endl;
    }

};

int main()
{
    Test a(1); //调用 Test(int i)构造函数进行创建a的类变量
    Test a1;//和上述结果相同同样是Test(int i)
    a1 = 10;//调用了Test(int i)生成了匿名的临时对象,然后调用Test& operator =(const Test& a)

    return 0;
}
在转换构造函数加上explicit,你就会发现程序不能编译报错是类型不匹配
如果你非要这样可以使用显示的类型转换,有三种方法
Test a1;//和上述结果相同同样是Test(int i)
a1 = Test(1);  //构造一个对象
a1 = static_cast<Test>(1); //使用类型转换
a1 = (Test)(1); //c风格的转换,不推荐

类类型转换为基本类型

可以通过定义类型转换函数

operator Type() {
    Type ret;
    return ret;
}

举例

#include <iostream>
using namespace std;

class Test{
public:
    Test(int i) {
        std::cout << "Test(int i)" << std::endl;
    }
    operator int() {
        int i = 1;
        return i;
    }

};

int main()
{
    Test a(1); //调用 Test(int i)构造函数进行创建a的类变量
    int aa = a; //由于类类型转换为基本类型,编译器隐士调用 operator int()来转换
    std::cout << aa << std::endl; // 结果为1

    return 0;
}

但是,对于这种重载的方式定义类型转换是不推荐的,因为会产生歧义,或者其他错误,如果有需求,定义toType()函数,显示调用

原文链接: https://www.cnblogs.com/chaohacker/p/12884892.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++的类型转换

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/348147

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午4:54
下一篇 2023年3月2日 上午4:55

相关推荐