C++类型转换
2023-12-15 22:01:36
写C/C++代码的时候,有时候不可避免的会使用类型转换,良好的编码风格中应该避免隐式转换,隐式转换会有时候产生不易察觉的问题。
隐式转换类型
C++定义了一套标准数据类型转换的规则,在必要时C++会用这套转换规则进行数据类型的转换。这种转换是在程序员不参与的情况下自动进行的,所以称为隐式转换。转换规则:
以下四种常见类型会发生隐式转换:
- 多种数据类型的算数表达式中
int a = 2;
float b = 3.4;
double d = 2.2;
a+b+d;
- 将一种数据类型赋值给另外一种数据类型变量
-
int a = 2; float b = 3.4; long double d = 2.2; b = a; d = a;
函数调用时,若实参表达式与形参的类型不符时
-
int main(int a, int b) { return a<b?a:b; } int a = 2; float b = 3.4; int x = main(b, a+3.5);
函数返回时,如果返回表达式的值域函数返回类型不同时
-
double add(int a, int b) { return a+b; }
显示类型转换(了解)
- 显示类型转换也称为强制类型转换,是指把一种数据类型强制转换为指定的另一种数据类型。
int a = 4;
float c = (float) a;//C风格,c++也支持
float d = float(a);//C++风格,C不支持;
C++提供了更严格的类型转换,可以提供更好的控制转换过程,C++增加了四个强制转换运算符。
static_cast, dynamic_cast, const_cast 和 reinterpret_cast.
静态类型转换 static_cast;
- 目标类型变量 = static_cast <目标类型>(源类型变量);
- 用于隐式转换的逆转换,常用于基本数据类型之间的转换,void*转换为其他类型的指针
- 不能用于整型和指针之间的互相转换,不能用于不同类型的指针、引用之间的转换(风险高)
int main(int argc, const char *argv[])
{
int a = 100;
double b = a;
cout << b <<endl;
char c = char(a);
cout << c << endl;
float f = static_cast<float>(a);
cout << f <<endl;
void *p;
p = malloc(100);
int *q = static_cast<int *>(p);
char *m = static_cast<char *>(q);
q = m;//errno
return 0;
}
重解释类型转换reinterpret_cast
- 目标类型变量 = reinterpret_cast<目标类型>(源类型变量);
- 用于任意类型指针或引用之间的转换
- 指针和整型数之间的转换;
- 高风险转换
#include <cstdlib>
using namespace std;
int main(int argc, const char *argv[])
{
void *p;
p = malloc(100);
int *q = static_cast<int *>(p);
int m = reinterpret_cast<int>(p);
char *n = reinterpret_cast<char *>(q);
//char l = reinterpret_cast<char>(q);//errno
int a = 0x00414243;
char *b = reinterpret_cast<char *>(&a);
cout << b << endl;
cout << hex << a << endl;
return 0;
}
const_cast(去除常量转换)
#include <iostream>
using namespace std;
int main(int argc, const char *argv[])
{
int a = 200;
const int *p = &a;
//(*p)++;//错误,不能运算
cout << *p << endl;
int *q = const_cast<int *>(p);
cout << *q << endl;
return 0;
}
动态类型转换dynamic_cast
- 目标类型变量 = dynamic_cast<目标类型>(源类型变量);
- 主要用于多态中类指针的向下转型,可以检测是否可以转型成功(后面讲)
文章来源:https://blog.csdn.net/2201_75441920/article/details/134980580
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!