C++/C数据类型转换小结

    几个问题作为开端:如果在编写代码的时候,如果将一个基本类型转换为一个类对象?反过来,如何将一个类对象转换成一个基本的数据类型?什么是隐式类型转换?什么是显式类型转换?读完这边文章,你可以清楚的了解在编写C++代码过程中的这些问题。

Q1:隐式类型转换

A1: 在程序员完全不知情的情况下,编译器按照自己认为正确的方式自动帮程序员完成转换。

下面是具体说明:

int poppins;//定义一个整型变量

double p_wt = poppins;//把整型变量赋值给一个double型变量。

String str = “adfsfafa”;//这里,右边是一个char*类型指针,编译器将隐式转换成string对象。

 

但是我们知道,int类型的变量跟double类型的变量在内存中的存储方式是不一样的(这里不做详细介绍),这种情况下,编译器会给出一个警告,然后隐式转换把poppins的值转换成double型的值,赋给p_wt。

注意,有些基本变量之间能够隐式转换,而有些变量如果想尝试隐式转换,编译器将会报错。如:int* p_int = 10; 指针和整型不能实现隐式转换。
 



Q2:显示类型转换

A2:程序员自己想通过C++提供的方式来转换自己想要的类型。

下面是详细的具体说明:

 

First:

通过C++提供的关键字进行转换,格式:keyword<type2>(type1):

·  static_cast<type2>(type1): 将type1强制转换成type2,条件是type1跟type2必须是具有某种关系,如继承关系等。

·  const_cast<type2>(type1):接触type1的const属性,并转换成type2的类型。

·  reinterpret_cast<type2>(type1):将指针类型type1转化成type2指针类型。如:cptr = reinterpret_cast<char *>(ptr);//cptr是char型指针,ptr是int型指针。

·  dynamic_cast<type2>(type1):运行时检查,将基类type1的指针转换成派生类type2的指针,如果type2和type1没有继承关系,将返回NULL指针。

如:dynamic_cast<&Annial>(&Dog)//if class Dog is inherif from Annial,it will convert the point of Dog to Annial point, and return the Annial point; or it will return NULL point.

Second:

   如果不使用强制类型转换关键字,可以使用(type1)type2的方式进行强制转换

如:(int)d_volume;// d_volume是一个double类型变量,将double变量转换成int类型变量。
 


          Q1Q2讨论的是基本数据类型之间,类对象之间的类型转换以及基本数据类型向类对象之间的转换,下面讲的将是如何实现类向基本类型之间的转换。

Q3:   类对象转换成基本数据类型

A3:在这里先介绍一下转换函数的概念:转换函数是一种特殊的C++操作符函数,格式为: operator typeName();

如果类定义中定义了转换函数,那么就可以利用转换函数将一个类对象转换成基本数据类型。

下面进行详细的描述:

 

其实转换函数是一个基本的成员函数,只是定义稍微有点特殊:

Operator double ()const

{

Return double(pound+0.5);

}

这里注意,没有返回值,没有参数

Long gone = (double)poppin;//poppin是一个类对象,通过double转换函数,就转换成了double类型,然后再转化成long类型。

 
 

 对比一下在C语言中有关类型转换的知识点:

在C语言编程中,有很多情况是编译器会帮你默认类型提升的,如:short int, char, 和枚举类型数据在计算的过程中会被自动提升为int类型,float类型会被自动提升为double类型。

例子1: printf("%d ", sizeof 'A');//在这里打印的并不是1,而是4,在有关char计算的过程中,一般都是先转化成int型计算,然后再转化成char类型

float fa, fb, result;

result = fa + fb;//这里也是想把fa,fb转化成double计算,然后再裁剪成float,但是也有可能有些编译器把他们直接当成float和char来计算,如果计算结果不溢出的话。

另外,在函数调用的时候,如果函数定义与函数调用的类型不一致,如果编译器认为可以找到合适的原型,那么也有可能发生类型转换的可能,在被调用函数的内部,参数会被裁剪成原先声明的大小。

总之,类型是否发生转换,是跟上下文息息相关的,要根据上下文判断。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页