C++类型转换:
C++类型转换分为:隐式类型转换和显式类型转换
隐式类型转换:
又称为“标准转换”,包括以下几种情况:
1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。
int ival = 3;
double dval = 3.14159;
ival + dval;//ival被提升为double类型
2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型
int *pi = 0; // 0被转化为int *类型
ival = dval; // double->int
例外:void指针赋值给其他指定类型指针时,不存在标准转换,编译出错
3)将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型
extern double sqrt(double);
cout << "The square root of 2 is " << sqrt(2) << endl;
//2被提升为double类型:2.0
4)从一个函数返回一个表达式,表达式类型与返回类型不一致:目标转换类型为函数的返回类型
double difference(int ival1, int ival2)
{
return ival1 - ival2;
//返回值被提升为double类型
}
显示类型转换:
/*File: base.cpp
*Author: sin
*Date: 2014-4-15
*Mail: 413977143@qq.com
*/
#include <iostream>/* input/output bin*/
#include <string>
using namespace std;
/* 数据类型转换分为隐士类型转换和显式类型转换
*/
int main()
{
cout << "********static_cast 类型转换使用************" <<endl;
/*
* static_cast : 数值类型之间转换,
* 用法:static_cast < type-id > ( expression )
* 运算符把expression 转换为 type-id 类型,但没有运行时类型检查来保证转换的安全性。
* 1、用于类层次结构中基类和子类之间指针或引用的转换
* 2、用于基本数据类型之间的转换
* 3、把void指针转换成目标类型的指针(不安全!!)
* 4、把任何类型的表达式转换成void 类型
*/
int n = static_cast<int>(45.67);//C++中必须进行转换才能编译通过。
int *p = static_cast <int *> (calloc(sizeof(int),10));
cout << "n = static_cast<int>(45.67) : " << n << endl;
free(p);
p = NULL;
cout << "******** const_cast 类型转换使用************" <<endl;
/*
* const_cast : 数值类型之间转换,
* 用法:const_cast < type-id > ( expression )
* 该运算符用来修改类型的const或volatile属性
*/
const int k = n;
cout << "const int k = " << k << endl;
const_cast <int &>(k) = 789;
cout << "const_cast <int &>(k) = " << k << endl;
cout << "******** reinterpret_cast 类型转换使用************" <<endl;
/*
* reinterpret_cast : 数值类型之间转换,
* 用法:reinterpret_cast < type-id > ( expression )
* type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
* 它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针
* (先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)
*/
float f = 123.12;
p = reinterpret_cast<int *>(&f);
cout << *p << endl;
n = int (12.34);
cout << "n = " << n << endl;
n = int();
cout << "n = " << n << endl;
int m(100);
cout << "m = " << m << endl;
int x(); //函数声明
int (y) = 200; //尽量不用,容易跟强制类型转换混淆
cout << "y = " << y << endl;
}
const 在 C与C++中,使用的不同:
一直以为被const 修饰的常量是不能被修改的,实际上是可以的,
#include <stdio.h>
//C 语言里可以通过指针来修改只读的常量
int main()
{
const int a = 10;
int *p = NULL;
printf("修改前a = %d, &a = 0X%x\n",a,&a);
p = (int *)&a;
*p = 11;
printf("修改后a = %d, &a = 0X%x\n",a,&a);
printf("修改后*p = %d, p = 0X%x\n",*p,p);
return 0;
}
输出:
修改前a = 10, &a = 0Xbfc07f08
修改后a = 11, &a = 0Xbfc07f08
修改后*p = 11, p = 0Xbfc07f08
C++的
/*File : const.cpp
*Auth : sjin
*Date : 2014-04-29
*Mail : 413977243@qq.com
*/
#include <iostream>
using namespace std;
int main()
{
const int a = 10;
int *p = nullptr;
cout << "修改前a =" <<a << ",&a = " << &a << endl;
p = (int *)&a;
*p = 11;
cout << "修改后a =" << a << ",&a = " << &a << endl;
cout << "修改后*p ="<< *p << ",p = " << p << endl;
return 0;
}
输出:
1、http://www.cnblogs.com/chio/archive/2007/07/18/822389.html