类型转换函数

普通类型到类类型的转化:转换构造函数

类类型到普通变量/其他类类型的转化:类型转换函数

 

转化构造函数:

  1.只有一个参数。

  2.参数时基本类型或则其他类类型。

   3. 编译器会隐式的调用转换构造函数。 

#include<iostream>
#include<string>
using namespace std;

class Test
{
public:
    Test(){}
    Test(int i){}  // 转换构造函数
};

int main(void)
{
    Test t;
    t = 5;     // 调用隐式类型转换函数  t= test(5);
    return 0;
}

 

 通过关键字可以防止编译器的隐式转化的尝试

当转换构造函数被explicit修饰时,只能进行显示的转换。

static_cast<ClassName>(value); // 显示的转化

ClassName t = 5;   // 隐式的转化(不推荐)
ClassName(vlaue); 
(ClassName)value;

 

普通类型到类类型的转化:

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int mValue;
public:
    Test()
    {
        mValue = 0;
    }  
    explicit Test(int i)  // 加explicit的转换构造函数
    {
        mValue = i;
    }  
    Test operator + (const Test& p)
    {
        Test ret(mValue + p.mValue);
        
        return ret;
    }    
    int value()
    {
        return mValue;
    }
};

int main()
{   
    Test t;
    t = static_cast<Test>(5);    //只有采用显示的类型转换 t = Test(5);
    
    Test r;
    r = t + static_cast<Test>(10);   //只有采用显示的类型转换 r = t + Test(10); 
    return 0;
}

 

类型转换函数:

  1. 类类型到普通变量/其他类类型的转化。

  2. 编译器会隐式的调用类型转化函数。

语法:

operator Type()  // Type 是将要转换的类型 
{
    Type ret;
    // do something
    return ret;
}

 

 

 

在类型到类型的转换中:当一个类定义类型转换函数另一个类定义转换构造函数时,产生冲突。

解决办法:定义类的构造转换函数为 explicit

Class Test 
{
    int value;
public:
    Test(int i){value = i;}
    int Test(){return Test;}
    Test(Value& v){}  //Test的转换构造函数
};

Class Value 
{
    int value;
public:
    Value(int i){value = i;}
    int value(){return value;}
    operator Test(){Test ret;return ret;} //Value的类型转换函数
};

int main(void)
{
    Test t(100);
    Value v(10);
    t = v;       // 报错,冲突
    rturn 0;
}

 

 

不要实现类型转换函数,用公有成员函数代替类型转换函数。

Type toType()

调用公有成员函数将其他类型转换为Type类型。

Class Value 
{
    char value;
public:
    Value(int i){value = i;}
    int value(){return value;}
    int toint(){int ret;return ret;}       //公有成员转换函数
    long tolong(){long ret;return ret;}    //公有成员转换函数
    float tofloat(){float ret;return ret;} //公有成员转换函数
};

int main(void)
{
    Value v(10);
    int a = v.toint();      // 调用对应的转换函数
    long b = v.tolong();    // 
    float c = v.tofloat();  // 
    rturn 0;
}

 

posted @ 2019-05-09 19:59  张不源  Views(823)  Comments(0Edit  收藏  举报