您的当前位置:首页正文

C++中的显示类型转换

2024-11-27 来源:个人技术集锦

一、静态类型转换

目标类型 变量 = static_cast<目标类型>(源对象)
使用场合:
如果源对象和目标类型对象任何一方可以进行隐式类型转换,那么两边都可以进行静态类型转换
例如:char 可以隐式转换成 int;int* 可以隐式转换成 void*
则:这两者可使用静态类型转换

#include <iostream>
using namespace std;

//C++ 凡事需要进行类型转换其实是程序设计的失误
int main(){
	//char -可以隐式转换成-int
	char c = 'a';
	int a = static_cast<int>(c);//静态类型转换
	int b = c;//不建议这样使用
	cout << a << endl;
	int x = 13423;
	c = static_cast<char>(x);
	char d = x;
	cout << c << ":" << d << endl;
	
	return 0;	
}

二、常类型转换

目标类型 变量 = const_cast<目标类型>(源对象)
使用场合:
去除常对象 或者 常引用的常属性;
源对象必须是 常指针或者常引用
const int x = 10;
int p = const_cast<int>(&x);
int& ra = const_cast<int&>(x);

常指针:

#include <iostream>
using namespace std;

int main(){
	const int x = 10;//x不会再变  相当于宏 所有使用x的地方直接用10替换	
	//int z = const_cast<int>(x);//必须是常指针或常引用

	const int *p = &x;
	//int *px = &x; //在C++中 const int *类型不能隐式转换成 int*
	int *px = const_cast<int*>(&x);//去除指针的常属性
	*px = 1000;
	cout << x << endl;//10
	cout << *px << endl;//1000
	cout << &x << endl;
	cout << px << endl;
	cout << *p << endl;	
	
	int y = x;
	cout << y << endl;
	
	cout << *(&x) << endl;//  10
	//int * const p;	
	const int *p1 = &x;
	cout << *p1 << endl; //1000
	
	return 0;	
}

常引用:

#include <iostream>
using namespace std;

void fun(const int& r){
	//r = 100;	
}

int main(){
	int x = 10;
	fun(x);
	fun(1);
	const int &r = 100;//引用常量   常引用   即引用常量的引用
	//int& rx = 10;
	int &rx = const_cast<int&>(r);
	cout << rx << endl;
	//r = 119;
	rx = 119;
	cout << r << endl;
	cout << rx << endl;
	return 0;	
}

三、重解释类型转换

目标类型 变量 = reinterpret_cast<目标类型>(源对象)
使用场合:
必须是指针与指针之间进行转换;
或者指针与整数之间进行转换
注意:
void * 与 指针 之间 既可以用 static_cast 也可以用 reinterpret_cast

#include <iostream>
using namespace std;

int main(){
	int a = 97;
	//char *p = &a;//不能直接转换  不存在隐式类型转换
	char *p = reinterpret_cast<char *>(&a);
	cout << *p << endl;
	void *pv1 = &a;//隐式类型转换  void*和任意指针都可以进行隐式类型转换
	void *pv2 = reinterpret_cast<void *>(&a);
	void *pv3 = static_cast<void *>(&a);
	int *pi1 = reinterpret_cast<int*>(pv1);
	cout << *pi1 << endl;
	int *pi2 = static_cast<int*>(pv2);
	cout << *pi2 << endl;
	//double *pd = static_cast<double *>(&a);//int *和double*之间不能隐式转换
	double *pc = reinterpret_cast<double *>(&a);

	//a = p;//C语言警告  C++报错
	a = reinterpret_cast<int>(p);
	cout << a << endl;
	cout << hex << a << endl;
	//int *pa = a;
	int *pa = reinterpret_cast<int *>(a);
	cout << *pa << endl;
	cout << pa << endl;
	
	return 0;	
}

四、动态类型转换

目标类型 变量 = dynamic_cast<目标类型>(源对象)
使用场合:
用于父子多态中,父子类型的引用或者指针之间的转换
多态 :父子之间的引用或者指针

#include <iostream>
using namespace std;

class F{
public:
	virtual void f(){
		cout << "F f()" << endl;	
	}
};

class S:public F{
public:
	double x;
	void show(){
		cout << "S show()" << endl;	
	}
	void f(){
		cout << "S f()" << endl;	
	}
};

class T:public F{
public:
	char y;
	void print(int x){
		cout << x << endl;
		cout << "T print()" << endl;	
	}
	void f(){
		cout << "T f()" << endl;	
	}
};

int main(){
	S s;
	T t;
	F& rs = s;
	S& r1 = static_cast<S&>(rs);
	//T& r2 = static_cast<T&>(rs);//非常危险 rs引用S对象 通过静态类型转换为T类型
	if(typeid(rs) == typeid(T)){
		T& r3 = dynamic_cast<T&>(rs);	
	}
	try{
		T& r2 = dynamic_cast<T&>(rs);
		r2.print(10);//r2是T类型 调用T类型的函数
		r2.f();//r2的对象是S类型对象
	}catch(exception& e){
		cout << "不能进行转换" << endl;	
	}
	F& rt = t;
	
	return 0;	
}
显示全文