C++风格的强制类型转换
命名的强制类型转换符号的一般形式如下:
cast-name<type>(expression);
其中,cast-name为以下中的四种操作符之一,type是转换的目标类型,而expression是被强制转换的值,返回为转换后的结果。
1. static_cast
平时使用的编译器隐式执行的任何类型转换都可以通过static_cast执行。
示例:
double d = 97; //定义了double型变量d
char ch = static_cast<char>(d); //类型转换为char
void *ptr = &d; //定义了void*型指针指向d
double *dp = static_cast<double*>(ptr); //将void*型指针转为double*型
2. const_cast
const_cast用于去掉变量的const属性
示例:
int main() //省略了头文件和using等语句
{
int i(0);
const int &j = i; //定义了i的const型引用。
const_cast<int&>(j) = 10; //将j强制转换为int&型,并赋值10。
cout << i << endl; //输出可以看到i变为了10。
system("pause");
return 0;
}
*注:vs中提示const_cast只能作用在指针,引用,或指向对象类型的指针上。
3. reinterpret_cast
reinterpret_cast提供更低层次的转换(出错的可能更大)。
示例:
int i = 10;
int *ip = &i;
char *pc = reinterpret_cast<char*>(ip);//将int*型指针强制转换为char*型指针。
4. dynamic_cast
将会在以后的博文中介绍
杂项
- sizeof() 表达式的结果是编译时常量。
- int型变量的
前自增/自减
和后自增/自减
的效率差异能被编译器优化掉。而对迭代器等类型来说,前自增/自减
和后自增/自减
之间的性能差异较为显著。
- C++中,下式是未定义的行为,因为 求值顺序未知。
if( ia[index++] < ia[index] ) //undefined