栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022.8.3 C++——C++类型转换方式1(static

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022.8.3 C++——C++类型转换方式1(static

C++四种类型转换方式
  • static_cast
    • 1 用于基本类型间的转换,如把int转换成char,把int转换成enum
    • 2 指针转换的限制
    • 3 可以将void*转换为其他类型
    • 4 弃值表达式
    • 5 左值转到右值
    • 6 用于类层次结构中基类和派生类之间指针或引用的转换

static_cast

用法: static_cast(expression)
说明:该运算符把expression转换为type_name类型,static_cast在编译时使用类型信息执行转换,在转换执行必要的检测(如指针越界计算,类型检查等),但没有运行时类型检查来保证转换的安全性。
使用范围:

1 用于基本类型间的转换,如把int转换成char,把int转换成enum
enum WeekType {sun=0,mon=1,thus=2,wed=3,thurs=4,fir=5,sat=6};
int main()
{
	int main()
{
	int a = 10;
	cout << a << endl;
	char ch = 'x';
	cout << ch << endl;
	double dx = 12.23;
	cout << dx << endl;
	a = static_cast(ch);
	cout << a << endl;
	a = static_cast(dx);
	cout << a << endl;
	WeekType x = mon;
	a = x;
	cout << a << endl;
	x = static_cast(a);
	cout << x << endl;
}

这个代码中,转换的都有:将ch转换为int类型,dx转换为int类型,a转换为枚举类型,这些都是基本类型间的转换。
输出结果为:

注意,其中的x转换成int类型后,打印的是其ASII值

2 指针转换的限制
int main()
{
	int a = 10;
	int* p = &a;
	int* s = static_cast(&a);
	//指针转换的限制
	const int* cp = &a;
	s = static_cast(cp);//error
	char* dp = static_cast(p);//error
}

注意:
s = static_cast(cp)错误,是因为static_cast不能转换掉const属性(包括volatile);
char* dp = static_cast§错误,是因为指针p是int类型,而要转换成char类型,这是不允许的。

3 可以将void*转换为其他类型
int main()
{
	int a = 10;
	int* ip = nullptr;
	double* dp = nullptr;
	void* vp = &a;
	ip = static_cast(vp);
	dp = static_cast(vp);
	return 0;
	
}

注意:

4 弃值表达式
int main()
{
	int a = 10;
	int b = 20;
	static_cast(a + b);

	return 0;	
}

5 左值转到右值
int main()
{
	int a = 10;
	int &x = a;
	int&& rx = a;//error
	int&& rx = static_cast(a);

	return 0;	
}

代码中&& rx = a错误是因为,一个&加变量rx是引用,两个&加变量rx就变成了右值,右值就是不能取地址的值(不能修改的值),如果一意将一个左值a给rx,这是不行的。
但是可以用static_cast将左值转换成右值,即int&& rx = static_cast(a)。

6 用于类层次结构中基类和派生类之间指针或引用的转换
class Object
{
private:
	int value;
public:
	Object(int x=0):value(x) { }
	void func() { }
};
class Base :public Object
{
private:
	int num;
public:
	Base(int x = 0) :Object(x + 10), num(x) { }
	void show() const { }
};
int main()
{
	Object* op = nullptr;
	Base* bp = nullptr;
	Base base;
	Object obj;
	op = &obj;
	bp = &base;
	op = static_cast(&base);
	bp = static_cast(&obj);//不安全
	return 0;
}

代码中出现了上行转换和下行转换,即上行转换为把派生类的指针或引用转换为基类表示,下行转换为把基类的指针或引用转换为派生类表示,注意上行转换是安全的,下行转换没有动态类型检查,是不安全的。

注意:
隐式执行任何类型的转换都可由static_cast显示完成,但是static_cast不能转换掉表达式含有const,volatile或者_unaligned属性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号