走进C++程序世界-------强制数据类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值