zoukankan      html  css  js  c++  java
  • 类型转换函数

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

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

    转化构造函数:

      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;
    }
  • 相关阅读:
    CentOS中安装Nginx
    SSM框架中Mybatis的分页插件PageHelper分页失效的原因
    linux相关设置
    windows下安装ElasticSearch的Head插件
    git学习
    消息队列介绍和SpringBoot2.x整合RockketMQ、ActiveMQ 9节课
    C# if语句
    C# switch语句
    C# for语句
    C# foreach语句
  • 原文地址:https://www.cnblogs.com/zsy12138/p/10840688.html
Copyright © 2011-2022 走看看