07.18_111期_C++_异常

类型转换

具有一定关联的值才能进行类型转换

在C语言中,下面的情况可以进行类型转换

case1: 隐式类型转换,不需要特殊给定一个符号说明发生类型转换

整型 和 整型之间(有无符号)

浮点数 和 整型之间 (short、long、double、float 和 int)

case2: 强制类型转换,需要特殊给定一个符号说明发生类型转换

整型和指针

不同类型的指针之间

注意:

不是只要给定符号就能强制类型转换,比如 double 和 指针

在C++中,在C语言的基础之上,还有下面的情况可以进行类型转换

case1: 内置类型 转换成 自定义类型

比如一个类中 实现了一个 单参数的构造函数,

而且这个参数是内置类型,那么此内置类型 可以和 自定义类型转换

case2: 自定义类型 转换成 内置类型

case3: 自定义A类型 转换成 自定义B类型

在 B 类中设计一个构造函数,这个构造函数的参数是 A 类的变量即可

cpp 复制代码
class A
{
public:
	// 如果用explicit 修饰构造函数,表明这个类如果想要调用这个构造函数
	// 不能使用 形如 A te = 1; 的语句进行初始化
	// 只能使用 A te(1); 进行初始化
	// explicit A(int a1)
	A(int a1)
		:_a1(a1)
	{}

	A(int a1, int a2)
		:_a1(a1)
		,_a2(a2)
	{}

	operator int()
	{
		return _a1 + _a2;
	}
private:
	int _a1 = 1;
	int _a2 = 1;
};

int main()
{
	int i = 1;
	A te(1);

	int j = te;

	// while (cin.operator>>(x).operator bool())
	// cin 通过重载 >> 这个运算符返回一个对象,
	// 这个对象可以通过 operator bool() 转换成一个 bool 类型的变量
	while (cin >> i)
	{
		cout << i << endl;
	}

	string str;
	while (cin >> str)
	{
		cout << str << endl;
	}

	return 0;
}
cpp 复制代码
// 对于下面的程序,在进行 (end >= pos) 比较时
// end 会被转换成 size_t
void insert(size_t pos)
{
	int end = 10;
	while (end >= pos)
	{
		cout << end << endl;
		--end;
	}
}

int main()
{
	// C++ 中类型转换可以通过 static_cast 和 reinterpret_cast
	// 其中 static_cast 对应的是隐式类型转换
	// reinterpret_cast 对应的是强制类型转换
	int i = 1;
	double x = static_cast<double>(i);
	A aa1 = static_cast<A>(1);

	int j = 9;
	int* p = reinterpret_cast<int*>(j);

	// 但是 double x = reinterpret_cast<double>(p); 这句话还是非法的

	return 0;
}
cpp 复制代码
int main()
{
	// const 修饰的常量仍存放在栈区
	// volatile 这个关键字去掉了 一些编译器的优化
	// 有一些编译器会直接从寄存器中拿数据,
	// volatile 修饰以后,保证总是通过一个变量 对应的 内存地址取到这个 变量对应的值
	// volatile const int a = 1;
	const int a = 1;
	
	// 可以通过 int* ptr = (int*)&a; 这种代码
	// 强行将 a 的管理变成通过可以更改的变量 ptr,其实是很危险的
	//int* ptr = (int*)&a;
	// const_cast 强调了转换之后的变量可能
	// 从 不会改变值的 变量 变成了 会发生改变的 变量
	int* ptr = const_cast<int*>(&a);
	(*ptr)++;

	cout << *ptr << endl;
	cout << a << endl;

	return 0;
}
相关推荐
2401_889884662 分钟前
嵌入式C++测试框架
开发语言·c++·算法
1104.北光c°2 分钟前
我理解的Leaf号段模式:美团分布式ID生成系统
java·开发语言·笔记·分布式·github·leaf
DREW_Smile6 分钟前
字符函数和字符串函数2
c语言·开发语言
月明长歌11 分钟前
【码道初阶-Hot100】LeetCode 128. 最长连续序列:从排序双指针扫描到 HashSet,一文讲透为什么 O(n) 解法要用哈希
算法·leetcode·哈希算法
Z9fish16 分钟前
C语言算法专题总结(一)排序
c语言·算法·排序算法
wjs202418 分钟前
CSS 颜色
开发语言
无巧不成书021820 分钟前
Java数值字面量速查表
java·开发语言·python·开发者·字面量
小鸡吃米…20 分钟前
测试线程应用程序
开发语言·python
python开发笔记21 分钟前
python(79) 底层代码追踪工具
开发语言·python
kgduu21 分钟前
js之错误处理
开发语言·前端·javascript