强制类型转换

在C语言中,使用如下风格的类型转换。这种C语言风格的转换方式在C++中仍然可以使用。

   1 int m = 1, n = 3;
   2 cout << (double)m / (double)n

在C++中,有一种新的转换方式:

   1 int m = 1, n = 3;
   2 cout << double(1)/double(3);

这种风格只能做简单类型的类型转换,不能进行复合类型的转换(比如指针类型)

在C++中,还有一种新的转换方式:

static_cast<>() 静态转换
const_cast<>() 去掉指针的常数性
reinterpret_cast<>() 指针类型强制转换 
dynamic_cast<>() 多态类型强制转换

   1 int hits = 10, at_bats = 78;
   2 double average = static_cast<double>(hits) / static_cast<double>(at_bats);

const_cast去除指针指向对象的const性

   1 const int a = 0;
   2 const int *p = &a;
   3 *p = 3; // Error
   4 *(int *)p = 5; // ok
   5 *const_cast<int *>(p) = 5; // ok
   6 const_cast<int>(a) = 5; // error
   7 

reinterpret_cast将一个类型的指针转换成另一个类型

   1 char array[] = "hello world";
   2 char *p1 = array;
   3 int *p2 = (int *)p1; //c
   4 int *p2 = reinterpret_cast<int *>(p1); //c++
   5 const char *p3 = "hello world;
   6 int *p4 = reinterpret_cast<int *>(p3); // error
   7 int *p4 = reinterpret_cast<int *> ( const_cast<char *>(p3) );

dynamic_cast在多态中使用,后面再介绍。

练习,在下面x的地方填入适当的转换运算:

   1 int hits = 315, at_bats = 13;
   2 float average = x_cast<float>(hits) / x_cast<float>(at_bats);
   3 
   4 const int * find(int val, const int * t, int n);
   5 int a[] = {2, 4, 6};
   6 int *ptr = x_cast<int *>(find(4, a, 3));
   7 
   8 float f = -6.9072;
   9 unsigned char *p = x_cast<unsigned char*>(&f);


CategoryCpp

C++:强制类型转换 (2008-03-13 20:59:20由czk编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.