C++之基本数据类型转换和转换函数

时间:2022-11-19 04:46:55

      基本数据类型转换

      C++语言中类型转换有两种:隐式转换和强制转换。在类型转换的过程中还有保值转换和非保值转换之分。保值转换是安全的,数据精度不会受到损失,如数据类型有低向高转换;非保值转换是不安全的,数据精度会受到损失,编译系统对这类转换会发出警告错,但是依然会运行程序,如数据类型由高到低的转换。

1保值的隐式转换

      在表达式中,如果两个操作数的类型不一致,则进行由低类型向高类型的安全转换。

       int  a=3;

       double   b=1.2;

       cout<<a+b<<endl;输出的结果是4.2(这是一个double的数据,这里进行a由int型向double型的隐式转换)

       各种类型的高低顺序如下所示:

        (short,char)→int →unsigned → long →unsigned long  →[(float)→double ]→  long double

        short型和char型自动转换成int型,float型自动转换成double型。

2保值的强制转换

      这种强制转换需要强制转换符((数据类型说明符)  (表达式))来实现。并且强制转换是暂时的,仅在被强制时才进行转换,在没有强制的时候依然保持原来的类型。

       int   a=1,b;

       double  c;

       c=1.21+double(a);

       b=2+a;

       cout<<b<<“,"<<c<<endl;(输出的结果是2.21,3)在表达式c=1.21+double(a)中,变量a被强制转换成double型,在表达式b=3+a中,a依然是int型。

3非保值的强制转换

       这种转换是高类型向低类型,数据精度一般将损失,是非保值的转换,编写程序时应避免这种转换。

       double    b=1.21;

       int   a;

       a=(int)b;

       cout<<a<<endl;(输出的结果是1,b的1.21被转换成1,精度会降低。)

4非保值的隐式转换

      这种转换一般在表达式中自动进行。

       int a;
       a=10-3.6/6-6/8;
       cout<<a<<endl;
       double b;
       b=10-3.6/6-6/8;
       cout<<b<<endl;(输出的结果是9和9.4,在表达式a=10-3.6/6-6/8中,精度降低)

         转换函数

      1,单参数构造函数

       在实际的应用中,如果类定义中提供了单参数构造函数,使用单参数构造函数可以将某种数据类型的数值或变量转换为该类的对象。这就是单参数构造函数所具有的类型转换功能。

<span style="font-size:18px;">#include <iostream>
using namespace std;
class A
{
public:
A()//定义的无参数的构造函数
{ a=0; }
A(double i)//单参数的构造函数
{ a=i;}
void Print()//一般成员函数
{
cout<<a<<endl;
}
private:
double a;
};
int main()
{
A a1;//定义的类的对象
a1=12;//在这里将12赋值给对象a1
a1.Print();//调用类中的成员函数
return 0;
}</span>

分析:在程序中的主函数中有一条赋值语句是a1=12;该赋值表达式的左右两端是两种不同类型的数据类型。a1是类的对象,12是int整型数。但是程序运行正常,这是因为该程序中自动进行了类型转换,将12转换为double型,再通过单参数构造函数将double型转换为类A的对象,最后才赋值给a1。

       2,类型转换函数

       类型转换函数是用来对类型进行强制转换的一种成员函数,它是类的一种非静态成员函数。称之为转换函数。定义的格式为:

       class   <类型说明符1>

       {

           public:

               operator  <类型说明符2> ()

        };

        其中,<类型说明符1>通常是一个类名,<类型说明符2>是转换函数名,它的功能是将<类型说明符1>的类型转换为<类型说明符2>的类型,其转换的方法就是在转换函数的函数体内定义。

        在程序中使用转换函数应注意:

        1,转换函数时成员函数,但是它必须是非静态的。

        2,在定义转换函数时不带类型说明,因为该函数名字就是类型转换的目标类型,

        3,转换函数是用来进行类型转换的,定义它的时候不带任何参数,

        4,转换函数不能定义为友元函数。

<span style="font-size:18px;">#include <iostream>
using namespace std;
class A
{
public:
A(int d,int n)//定义的带两个参数的构造函数
{
den=d;
num=n;
}
operator double();//类体内说明的转换函数
private:
int den,num;
};
A::operator double()//转换函数的函数体
{
return double(den)/double(num);
}
int main()
{
A a(8,5);//定义的类的对象
double c=3.5,f=2.6;
c+=a-f;//进行计算的运算表达式
cout<<c<<endl;
return 0;
}
</span>

分析:在程序的主函数中有一条运算语句c+=a-f;其中c和f是double型数,而a是类的一个对象,它们具有不同的类型,它们之间之所以能够进行算术运算,得益于转换函数operator double()。在运行的过种种转换函数将a转换为double型然后再进行运算。