类型转换函数_greenplum类型转换函数 - CSDN
精华内容
参与话题
  • 【c/c++】类型转换函数(类型转换运算符重载函数)

    千次阅读 多人点赞 2016-01-04 19:20:32
    用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成...如果已声明了一个Complex类,可以在Complex类中这样定义类型转换函数

    转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。在C++提供类型转换函数(type conversion function)来解决这个问题。类型转换函数的作用是将一个类的对象转换成另一类型的数据。

    如果已声明了一个Complex类,可以在Complex类中这样定义类型转换函数:

        operator double( )
        {
            return real;
        }
    函数返回double型变量real的值。它的作用是将一个Complex类对象转换为一个double型数据,其值是Complex类中的数据成员real的值。请注意,函数名是operator double,这点是和运算符重载时的规律一致的(在定义运算符“+”的重载函数时,函数名是operator +)。

    类型转换函数的一般形式为:
        operator 类型名( )
        {
            实现转换的语句
        }
    在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来确定的。类型转换函数只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数。

    从函数形式可以看到,它与运算符重载函数相似,都是用关键字operator开头,只是被重载的是类型名。double类型经过重载后,除了原有的含义外,还获得新的含义(将一个Complex类对象转换为double类型数据,并指定了转换方法)。这样,编译系统不仅能识别原有的double型数据,而且还会把Complex类对象作为double型数据处理。

    那么程序中的Complex类对具有双重身份,既是Complex类对象,又可作为double类型数据。Complex类对象只有在需要时才进行转换,要根据表达式的上下文来决定。转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象(或临时变量)。

    一定要注意这里是只有在需要的时候,只有在需要的时候才会去调用。


    使用类型转换函数的简单例子。

    #include <iostream>
    using namespace std;
    class Complex
    {
    public:
       Complex( ){real=0;imag=0;}
       Complex(double r,double i){real=r;imag=i;}
       operator double( ) {return real;} //类型转换函数
    private:
       double real;
       double imag;
    };
    
    int main( )
    {
       Complex c1(3,4),c2(5,-10),c3;
       double d;
       d=2.5+c1;//要求将一个double数据与Complex类数据相加
       cout<<d<<endl;
       return 0;
    }
    输出结果:

    5.5

    对程序的分析:

    1) 如果在Complex类中没有定义类型转换函数operator double,程序编译将出错。

    因为不能实现double 型数据与Complex类对象的相加。现在,已定义了成员函数 operator double,就可以利用它将Complex类对象转换为double型数据。请注意,程序中不必显式地调用类型转换函数,它是自动被调用的,即隐式调用。

    在什么情况下调用类型转换函数呢?编译系统在处理表达式 2.5 +cl 时,发现运算符“+”的左侧是double型数据,而右侧是Complex类对象,又无运算符“+”重载函数,不能直接相加,编译系统发现有对double的重载函数,因此调用这个函数,返回一个double型数据,然后与2.5相加。


    2) 如果在main函数中加一个语句:
        c3=c2;
    请问此时编译系统是把c2按Complex类对象处理呢,还是按double型数据处理?由于赋值号两侧都是同一类的数据,是可以合法进行赋值的,没有必要把c2转换为double型数据。

    3) 如果在Complex类中声明了重载运算符“+”函数作为友元函数:
        Complex operator+ (Complex c1,Complex c2)//定义运算符“+”重载函数
        {
            return Complex(c1.real+c2.real, c1.imag+c2.imag);
        }
    若在main函数中有语句
        c3=c1+c2;
    由于已对运算符“+”重载,使之能用于两个Complex类对象的相加,因此将c1和c2按Complex类对象处理,相加后赋值给同类对象c3。如果改为
        d=c1+c2; //d为double型变量
    将c1与c2两个类对象相加,得到一个临时的Complex类对象,由于它不能赋值给double型变量,而又有对double的重载函数,于是调用此函数,把临时类对象转换为double数据,然后赋给d。

    从前面的介绍可知,对类型的重载和对运算符的重载的概念和方法都是相似的,重载函数都使用关键字operator。因此,通常把类型转换函数也称为类型转换运算符函数,由于它也是重载函数,因此也称为类型转换运算符重载函数(或称强制类型转换运算符重载函数)。

    假如程序中需要对一个Complex类对象和一个double型变量进行+,-,*,/等算术运算,以及关系运算和逻辑运算,如果不用类型转换函数,就要对多种运算符进行重载,以便能进行各种运算。这样,是十分麻烦的,工作量较大,程序显得冗长。如果用类型转换函数对double进行重载(使Complex类对象转换为double型数据),就不必对各种运算符进行重载,因为Complex类对象可以被自动地转换为double型数据,而标准类型的数据的运算,是可以使用系统提供的各种运算符的。

    包含转换构造函数、运算符重载函数和类型转换函数的程序。

    先阅读以下程序,在这个程序中只包含转换构造函数和运算符重载函数。

    #include <iostream>
    using namespace std;
    class Complex
    {
    public:
    	Complex(){ real = 0; imag = 0; }  //默认构造函数
    	Complex(double r){ real = r; imag = 0; }//转换构造函数
    	Complex(double r, double i){ real = r; imag = i; }//实现初始化的构造函数
    	friend Complex operator + (Complex c1, Complex c2); //重载运算符“+”的友元函数
    	void display();
    private:
    	double real;
    	double imag;
    };
    Complex operator + (Complex c1, Complex c2)//定义运算符“+”重载函数
    {
    	return Complex(c1.real + c2.real, c1.imag + c2.imag);
    }
    void Complex::display()
    {
    	cout << "(" << real << "," << imag << "i)" << endl;
    }
    int main()
    {
    	Complex c1(3, 4), c2(5, -10), c3;
    	c3 = c1 + 2.5; //复数与double数据相加
    	c3.display();
    	return 0;
    }

    输出的结果为:

    (5.5,4i)


    对程序的分析:
    1) 如果没有定义转换构造函数,则此程序编译出错。

    2) 现在,在类Complex中定义了转换构造函数,并具体规定了怎样构成一个复数。由于已重载了算符“+”,在处理表达式c1+2.5时,编译系统把它解释为
        operator+(c1, 2.5)
    由于2.5不是Complex类对象,系统先调用转换构造函数Complex(2.5),建立一个临时的Complex类对象,其值为(2.5+0i)。上面的函数调用相当于
        operator+(c1, Complex(2.5))
    将c1与(2.5+0i) 相加,赋给c3。运行结果为
        (5.5+4i)
    3) 如果把“c3=c1+2.5;”改为c3=2.5+c1; 程序可以通过编译和正常运行。过程与前相同。

    从中得到一个重要结论,在已定义了相应的转换构造函数情况下,将运算符“+”函数重载为友元函数,在进行两个复数相加时,可以用交换律。

    如果运算符函数重载为成员函数,它的第一个参数必须是本类的对象。当第一个操作数不是类对象时,不能将运算符函数重载为成员函数。如果将运算符“+”函数重载为类的成员函数,交换律不适用。

    由于这个原因,一般情况下将双目运算符函数重载为友元函数。单目运算符则多重载为成员函数。

    这个和我们之前学过的所谓实参和传参的类型必须一致是一个道理,只不过这里就是更加的明确了,仔细了而已


    4) 如果一定要将运算符函数重载为成员函数,而第一个操作数又不是类对象时,只有一个办法能够解决,再重载一个运算符“+”函数,其第一个参数为double型。当然此函数只能是友元函数,函数原型为
        friend operator+(double, Complex &);
    显然这样做不太方便,还是将双目运算符函数重载为友元函数方便些。

    5) 在上面程序的基础上增加类型转换函数:
        operator double( ){return real;}
    此时Complex类的公用部分为:
       public:
       Complex( ){real=0;imag=0;}
       Complex(double r){real=r;imag=0;}  //转换构造函数
       Complex(double r,double i){real=r;imag=i;}
       operator double( ){return real;}//类型转换函数
       friend Complex operator+ (Complex c1,Complex c2); //重载运算符“+”
       void display( );

    其余部分不变。程序在编译时出错,原因是出现二义性。

    当类中出现了转换构造函数和类型转换函数的时候,必须要注意是否会出现二义性的问题

    展开全文
  • SQL中类型转换函数

    万次阅读 2018-09-03 19:33:16
     cast(表达式 as 数据类型)  select 100.0 +cast('1000' as int) -- 1100.0 默认把字符串转换成浮整形  2.convert convert(数据类型,表达式) select 100.0 + convert(int,'1000')-- 1100.0 默认把字符串...

    1.cast

       cast(表达式 as 数据类型)

       select 100.0 +cast('1000' as int)  -- 1100.0 默认把字符串转换成浮整形

     2.convert

    convert(数据类型,表达式)

    select 100.0 + convert(int,'1000')-- 1100.0 默认把字符串转换成整形

    3.select * from student  order by  convert (int,bid) desc --bid列按照降序来排列,bid是varchar类型

    4.print convert(varchar(10),getdate(),120) --日期转换varchar(10)表示显示的字符长度,120表示style,可以在SSMS 帮助中查看详情

    5.cast不可以转换日期类型,convert可以通用

    展开全文
  • 类型转换函数与转换构造函数

    千次阅读 2018-01-27 21:19:08
    1. 隐式类型转换规则 编译器的默认隐式类型转换规则: 先看个例子: short s = 'a'; unsigned int ui = 1000; int i = -2000; double d = i; //自己先想一下输出结果,会是什么 cout "d = " ; cout "ui + i = ...

    1. 隐式类型转换规则

    编译器的默认隐式类型转换规则:
    这里写图片描述
    先看个例子:

    short s = 'a';
    unsigned int ui = 1000;
    int i = -2000;
    double d = i;
    
    //自己先想一下输出结果,会是什么
    cout << "d = " << d << endl;
    cout << "ui + i = " << ui + i << endl;
    cout << "sizeof(s + 'b') = " << sizeof(s + 'b') <<endl;

    编译运行结果:

    d = -2000
    ui + i = 1000
    sizeof(s + 'b') = 4

    为什么会是这样??? 为什么不是 ui + i = -1000
    因为编译器做了隐式类型转换。
    看明白了吗?那想必你也就明白了为什么sizeof(s + ‘b’) = 4 了吧。

    2. 转换构造函数:

    构成:(1)、首先是一个类的构造函数
    (2)、有且仅有一个参数
    (3)、参数类型是 基本类型 或者 其他类类型
    转换:
    相当于C语言风格中的隐式类型转换,比如:
    int i = 1.5; //就是隐式转化成了i = (int)1
    所以这里的类Test t = 100; // 就是t = Test(100);

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Test
    {
        int mValue;
    public:
        Test()
        {
            mValue = 0;
        }
    
        Test(int i)   // 转换构造函数
        {
            mValue = i;
        }
    
        Test operator + (const Test& p)
        {
            Test ret(mValue + p.mValue);
    
            return ret;
        }
    
        int value()
        {
            return mValue;
        }
    };
    
    int main()
    {   
        Test t;
        t = 5;    // t = Test(5);
    
        Test r;
    
        r = t + 10;   // r = t + Test(10);
        cout << "r.value() = " << r.value() << endl;
    
        return 0;
    }

    猜一下能编译通过吗?如果能通过,运行结果是多少?
    编译运行结果:

    r.value() = 15

    为了避免隐式转换带来bug,所以在项目中通常使用关键字explicit杜绝编译器的隐式转化,转换构造函数被explicit修饰时只能进行显示转换。

    3. 类型转换函数

    现在我们来想一个问题, 一个基础数据类型 和 类类型 之间能不能进行相互转换?两个类类型之间能不能进行相互转换?
    示例1:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Test
    {
        int mValue;
    public:
        Test(int i = 0)
        {
            mValue = i;
        }
        int value()
        {
            return mValue;
        }
        operator int ()  // 重载int类型转换函数
        {
            return mValue;
        }
    };
    
    int main()
    {   
        Test t(100);
        int i = t;   // 把一个类类型赋值给一个int类型
    
        cout << "t.value() = " << t.value() << endl;
        cout << "i = " << i << endl;
    
        return 0;
    }

    示例2:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Test;
    
    class Value
    {
    public:
        Value()
        {
        }
        explicit Value(Test& t)  // 有explicit关键字修饰的转换构造函数,使用时需要显式调用
        {
        }
    };
    
    class Test
    {
        int mValue;
    public:
        Test(int i = 0)
        {
            mValue = i;
        }
        int value()
        {
            return mValue;
        }
        operator Value() // 重载Value类类型
        {
            Value ret;
            cout << "operator Value()" << endl;
            return ret;
        }
    };
    
    int main()
    {   
        Test t(100);
        Value v = t;
    
        return 0;
    }

    因为无法抑制隐式的类型转换函数调用,或者类型转换函数可能与转换构造函数冲突,所以在项目中通常使用Type toType()的共有成员函数代替类型转换函数。

    展开全文
  • C++类型转换函数

    千次阅读 2014-11-22 16:51:49
    // 2202.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include ...using namespace std;... 用类型转换函数可以将一个类的对象转换成一个指定类型的数据 类型转换函数的一般形式为: o
    // 2202.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    class Test
    {
    public:
    
    	/*
    	用转换构造函数可以将一个指定的类型的数据转换为类的对象
    	用类型转换函数可以将一个类的对象转换成一个指定类型的数据
    	类型转换函数的一般形式为:
    	operator 类型名()
    	{
    	实现转换的语句
    	}
    	在函数名前面不能指定函数类型,函数没有参数
    	下面的例子函数名是: operator int
    	
    	*/
    	operator int ()
    	{
    		return m_iNum;
    	}
    	
    
    private:
    	int m_iNum;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	Test test;
    	int m = test; //这里可以编译通过,如果没有类型转换函数,这里编译出错,因为类类型不能给int赋值,一旦我们定义了
    	//类型转换函数,它会隐式调用的
    
    
    	int i;
    	cin>>i;
    	return 0;
    }
    
    

    用转换构造函数可以将一个指定的类型的数据转换为类的对象

    用类型转换函数可以将一个类的对象转换成一个指定类型的数据

    类型转换函数的一般形式为:

    operator 类型名()

    {实现转换的语句}

    在函数名前面不能指定函数类型,函数没有参数

    展开全文
  • 一、int 和 String 相互转换 1、int 转 String //int 转 String(3种) 1) String s = String.valueOf(i); //直接使用String类的静态方法,只产生一个对象 2) String s = Integer.toString(i); 3) String s = "...
  • 1 CString,int,string,char*之间的转换   string 转 CString  CString.format("%s", string.c_str());  char 转 CString  CString.format("%s", char*);  char 转 string string s(char *);...
  • 类型转换及类型转换函数

    千次阅读 2018-02-03 21:39:46
    所以类型转换,就是为了告诉编译器这部分内存,应该用什么方式去解释它,如何组织这段内存。 1、C风格类型转换 c语言比较熟悉,指针类型的转换很常见。通过圆括号和标识符组成(type) expression。允许任何类型...
  • 用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。...类型转换函数的作用是将一个类的对...
  • mysql之类型转换函数

    千次阅读 2019-04-08 14:32:02
    类型转换函数 类型转换函数和case函数 1.隐式类型转换和显式类型转换的概念 隐式类型装换: 两个值进行运算或者比较,首先要求数据类型必须一致。如果发现两个数据类型不一致时就会发生隐式类型转换。例如,把字符串...
  • 1. 数据类型转换 函数 描述 int(x [,base=10]) 将x(字符串或数字)转换为整型,base-进制数,默认十进制 float(x) 将x(整数和字符串)转换为浮点型 complex(real [,imag]) real – ...
  • MySQL常用类型转换函数总结

    千次阅读 2019-03-25 11:50:27
    MySQL函数,常用类型转换函数总结 1、Concat函数。 连接字符串常用:concat函数。如sql查询条件的like查询,AND c.name like concat(#{param.name},'%') 将Int 转为varchar经常用 concat函数,比如concat(8,'0') ...
  • c++类的类型转换函数

    千次阅读 2017-08-12 12:45:15
    之前学习的,可以将普通类型转换为类类型,需要借助转换构造函数。那么反过来,类类型可以转换为普通类型吗?#include <stdio.h>class TestCls{ public: int a; TestCls(int x = 0) : a(x) {} };int main(void) { ...
  • Oracle类型转换函数

    千次阅读 2018-01-25 11:54:23
    TO_CHAR(date/number,'format'):按照指定格式format将number或date类型转换为字符串。9代表一个数字,0强制显示0,¥货币符号,L本地货币符号,.小数点,,千分号。 TO_NUMBER(char):将包含了数字的字符串...
  • 这一块知识点在学习C++时没有深入了解,在查看opencv基本数据结构...转换构造函数:预定义类型转换成类类型 一般形式 class C { public: double real; double imag; C() {} C(double i, double r) { real = ...
  • Excel VBA 类型转换函数

    万次阅读 2010-08-11 17:18:00
    Excel VBA 类型转换函数
  • vb.net中类型转换函数

    千次阅读 2013-12-05 15:15:45
    一、函数名确定它返回的值的数据类型,如下表所示。 函数名 返回数据类型 expression 参数范围 CBool Boolean 数据类型 (Visual Basic) 任何有效的 Char、String 或数值表达式。 CByte ...
  • access中数据类型转换函数

    千次阅读 2017-08-16 12:31:23
    类型转换函数   每个函数都可以强制将一个表达式转换成某种特定数据类型。 语法 CBool(expression) CByte(expression) CCur(expression) CDate(expression) CDbl(expression) CDec...
  • SQL Server系统函数:类型转换函数

    千次阅读 2019-01-31 10:00:16
    1.基本的转化 SELECT CAST(2008 as varchar(4)) + ' year!' SELECT CONVERT(varchar(4),2008) + ' year!' ...SELECT CONVERT(VARCHAR(30),GETDATE(),120) --年-月-日 时:分:秒(24h) ...SELECT CONVERT(VARCHA...
  • C++ 类型转换函数 与 explicit

    千次阅读 2017-06-29 11:41:44
    类型转换函数 与 explicit1. 类型转换函数在C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function)将一个类对象转换为其他类型的数据。我们直接通过一个...
  • vb.net类型转换函数

    千次阅读 2010-04-21 12:22:00
    Visual Basic 语言参考类型转换函数这些函数采用内联方式编译,即转换代码是计算表达式的代码的一部分。有时实现该转换时不需要调用某个过程,这将提高性能。每个函数都将表达式强制转换为一种特定的数据类型。 ...
1 2 3 4 5 ... 20
收藏数 1,089,428
精华内容 435,771
关键字:

类型转换函数