目录
C语言中的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型 转换和显式类型转换。
1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
2. 显式类型转化:需要用户自己处理
int i = 10.2; // 隐式类型转换,会警告
int* p = (int*)i; // C显式强制类型转换
缺陷: 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换
为什么C++需要四种类型转换
C风格的转换格式很简单,但是有不少缺点:
1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失,或其他难以预见的错误。
2. 显式类型转换将所有情况混合在一起,代码不够清晰。
因此C++提出了自己的类型转化方式,注意因为C++要兼容C语言,所以C++中还可以使用C语言的 转化方式。
回顾std::string的模拟实现,编译器隐式类型转换带来的错误:
string& insert(size_t pos, char c)
{
assert(pos <= _size);
if(_size == _capacity)
{
reserve(_capacity == 0?4:2*_capacity);
}
int end = _size;
while(end >= pos)
// while(end >= (int)pos)
{
_str[end+1] = _str[end];
end--;
}
// 比较推荐的写法,主要是 int和size_t比较,会出现比较错误,当int小于0时。
// size_t end = _size+1;
// while(end > pos)
// {
// _str[end] = _str[end-1];
// end--;
// }
_str[pos] = c;
++_size;
return *this;
}
如上,while循环的判断部分,运算符的两个运算数的类型不同,int与size_t,此时会发生隐式类型转换,int -> size_t,若pos == 0,则会发生死循环,故产生了while(end >= (int)pos) // 显式类型转换的写法,或者下方更推荐的写法。
C++:命名的强制类型转换
一个命名的强制类型转换具有如下形式:
cast_name<type>(expression);
type是转换的目标类型,expression是要转换的值。
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpre