第42课 类型转换函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第42课 类型转换函数相关的知识,希望对你有一定的参考价值。

1. 类型转换函数

(1)C++类中可以定义类型转换函数

(2)类型转换函数用于将类对象转换为其它类型

(3)语法规则:

operator Type()   //重载类型运算符
{
    Type ret;

    //……

    return ret;
}

【编程实验】类型转换函数初探

#include <iostream>

using namespace std;

class Test
{
    int mValue;
public:
    Test(){mValue = 0;}
    
    //转换构造函数
    Test(int i = 0) 
    {
        mValue = i;
    }
    
    //类型转换函数
    operator int()
    {
         return mValue;
    }
    
    int value()
    {
        return mValue;
    }
};

int main()
{
    Test t(100);
    int i = t; //t对象是Test类型,会调用转为int的类型转换函数
               //即隐式调用类型转换函数,等价于int i = t.operator int();    
    
    cout << "t.value() = "  << t.value() << endl; //100;
    cout << "i = " << i << endl; //100
    return 0;
}

2. 类型转换函数的意义

(1)类型转换函数转换构造函数具有同等的地位

(2)使用编译器有能力将对象转化为其它类型

(3)编译器会尽力尝试让源码通过编译

Test t(1);

int i = t; //t对象为Test类型,怎么可能用于初始化int类型的变量呢?现在就报
           //错吗?不急,编译器会看看有没有类型转换函数!Ok,发现Test类中定
           //义了opreator int(),可以进行转换。

(4)编译器能够隐式的使用类型转换函数

【编程实验】类类型之间的转换

#include <iostream>

using namespace std;

//前置声明
class Test;

class Value
{
public:
    Value(){}
    
    //转换构造函数
    explicit Value(Test& t)
    {
        
    }
};

class Test
{
    int mValue;
public:
    Test(){mValue = 0;}
    
    //转换构造函数
    Test(int i = 0) 
    {
        mValue = i;
    }
    
    //类型转换函数
    operator Value()
    {
        Value ret;
        cout << "operator Value()" << endl;
        return ret;
    }
    
    int value()
    {
        return mValue;
    }
};

int main()
{
    Test t(100);
    Value v = t; //如果Value类中的转换构造函数不加explicit,这会造成Test类的类型
                 //转换函数与Value类的转换构造函数的冲突。因为编译器看到这行时
                 //会出现两种理解:1、Value v(t),调用的是Value类的转换构造函数
                 //也可以理解成Value v = t.operator Value();调用的是Test类的类
                 //型转换函数,出现了二义性。因此加上explicit后会阻止第1种可能
                 //最后,等价于第2种,所以结果会输出:"operator Value()"
                 
    //Value v = static_cast<Value>(t);//相当于value v(t);                 
    
    return 0;
}

3. 注意事项

(1)无法抑制隐式的类型转换函数调用

(2)类型转换函数可能与转换构造函数冲突

(3)工程中以Type toType()的公有成员代替类型转换函数,如toInt()、toString()等。

4. 小结

(1)C++类中可以定义类型转换函数

(2)类型转换函数用于将类对象转换为其它类型

(3)类型转换函数与转换构造函数具有同等的地位

(4)工程中以Type toType()的公有成员代替类型转换函数

以上是关于第42课 类型转换函数的主要内容,如果未能解决你的问题,请参考以下文章

第41课 类型转换函数(上)

第57课 深入理解函数模板

第2课 python数据类型与转换

第四十一课类型转化构造函数(上)

怎么将字符串类型转换成int型?初学者简单方法

常用转换类型函数介绍