C++类型转换

C++类型转换#

静态转换

​ 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换

//指针
void test02() {
	Father* f = NULL;
	Son* s = NULL;
	//向下转换 不安全
	Son* s1 = static_cast<Son*> (f);
	//向上转换 安全
	Father* f1 = static_cast<Father*> (s);
	//没有 继承关系的类之间的指针不能转换
	//other* o = static_cast<other*>(s);
} 

//引用
void test02() {
	Father f;
	Son s;
	Father &ref_f = f;
	Son& ref_s = s;
	
	static_cast<Father&>(ref_s);
	static_cast<Son&>(ref_f);
} 

​ 用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证

//基础类型转换
void test02() {
	char a = 'a';
	//char - > double
	double d = static_cast<double> (a);
	// double d = (double)a;
}

动态转换:

l 不支持基础类型的转换

char a = 'a';
//不支持基础类型转换
dynamic_cast<double>(a); //error

l ynamic_cast主要用于类层次间的上行转换和下行转换;

l 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;

l 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全;

void test05() {
	Father* f = NULL;
	Son* s = NULL;
	//向下转换 不安全 会检测
	Son* s1 = dynamic_cast<Son*> (f); //error
	//向上转换 安全
	Father* f1 = dynamic_cast<Father*> (s);
}

l 发生多态时候,动态转换就可以

class Father {
public:
	virtual void func() {}
};
class Son :public Father {
	virtual void func() {} //重写父类虚函数
};
void test05() {
    //发生多态时候,可以向下转换
	Father* f = new Son;
	Son* s = dynamic_cast<Son*> (f);
}

常量转换

l 常量指针被转化成非常量指针,并且仍然指向原来的对象;

void test() {
	const int* p = nullptr;
	//const --> 不带const的
	int* newptr = const_cast<int*> (p);
}

void test01() {
	int* p = nullptr;
	//不带const的--> const
	const int* newptr = const_cast<const int*> (p);
}

l 常量引用被转换成非常量引用,并且仍然指向原来的对象;

void test05() {
	int num = 5;
	const int& refnum1 = num;
	//常量引用 ---> 非常量引用
	int& newrefnum1 = const_cast<int&> (refnum1);
}

void test02() {
	int num = 5;
	int& refnum1 = num;
	//常量引用 ---> 非常量引用
	const int& newrefnum1 = const_cast<cosnt int&> (refnum1);
}

重新解释转换

这是最不安全的一种转换机制,最有可能出问题。

主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针.

class other {};
class Father {
public:
	virtual void func() {}
};
class Son :public Father {
	virtual void func() {}
};

//重新解释转换
void test02() {
    //基础类型
	int num = 5;
	int* p = reinterpret_cast<int*> (num);
    //其他类类型
    Father *f = NULL;
	other* p = reinterpret_cast<other*> (f);
}
posted @   江寒雨  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
主题色彩