Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105349
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类:

2012-03-06 03:57:53

有些天没有扯了,还是把C++扯完吧。
今天说说type casting,也就是类型转换。有时候是需要将不同的类型进行转换的,那有哪些呢?

1. 间接转换
一看就明白,没有硬生生地直接地变,也不需要什么操作。当一个已知类型变量的值拷贝给另一种类型变量时,就会自动转换。

short a= 2000;
int b ;
b =a;

这是基本数据类型的转换,间接变换同样也适用与构造函数或操作转换。这将影响到包含特别的构造函数或操作函数的类。

class A {};
class B {public: B (A a) {} };
A a;
B b = a;

因为B的构造函数中的一个参数是A的对象,因此从A间接转到B是可以的。(不是很明白)

2. 直接转换
C++就是类型很强的语言,许多转换需要直接进行。 这也分两种:functional 和c-like casting。
short a = 2000;
int b;
b = (int) a;       //c-like cast notation
b = int (a);      //functional notation

这对基本数据类型是足够了。然而,这些转换用到类和指向类的指针上时,在程序运行的时候,会出现错误。

3. dynamic_cast
dynamic_cast 仅被用在指向对象的指针,它的目标就是确保类型变化的结果是一个有效的全面的所需要类的对象。
因此,dynamic_cast只有在将一个类转换为它基类的一种时,才能成功。
class CBase ();
class CDerived: public CBase();

CBase b; CBase * pb;
CDerived d; CDerived * pd;

pb = dynamic_cast (&d);                     //ok
pd = dynamic_cast (&b);                   //wrong

4. static_cast
可以在指向相关类的指针中相互转换,不仅是派生类到基类,也可以是基类到派生类。
但是类是兼容的,这也没有安全检查,全靠自己了。
class CBase {};
class CDerived:public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast (a);

5. reinterpret_cast
可以将任何类型的指针转换为其他任何类型的指针,即使是不相关的类。

6. const_cast
这个就是操作一个对象的常量属性,设置为常量或者去掉常量属性。
例如将一个常量属性的参数给一个函数,而这个函数要求参数必须是非常量,就用它转换了。
  1. //const_cast
  2. #include <iostream>

  3. void print (char * str)
  4. {
  5.   cout<<str<<endl;
  6. }

  7. int main () {

  8.    const char * c = "sample text";
  9.    print (const_cast<char*> (c)); //换了。
  10.    return 0;
  11. }

7. typeid
检查一个表达式的类型,
typeid (expression)
用的时候包含头文件

  1. //typeid
  2. #include <iostream>
  3. #include <typeid>
  4. using namespace std;

  5. int main ()
  6. {
  7.    int *a, b;
  8.    a = 0; b = 0;
  9.    if (typeid(a) != typeid(b))
  10.    {
  11.       cout<<"a and b are of different types:\n";
  12.       cout<<"a is: "<<typeid(a).name ()<<'\n';
  13.       cout<<"b is: "<<typeid(b).name ()<<'\n';
  14.    }
  15.    return 0;
  16. }


阅读(909) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~