当前位置: 首页 > wzjs >正文

做网站维护要什么专业搭建什么平台

做网站维护要什么专业,搭建什么平台,英文网站seo 谷歌,微商做网站C: 类型转换 (一)C语言中的类型转换volatile关键字 修饰const变量 (二)C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI (一)C语言中的类型转换 在C语言中…

C++: 类型转换

  • (一)C语言中的类型转换
    • volatile关键字 修饰const变量
  • (二)C++四种强制类型转换
    • 1. static_cast
    • 2. reinterpret_cast
    • 3. const_cast
    • 4. dynamic_cast
    • 总结
  • (三)RTTI

(一)C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。

C语言中总共有两种形式的类型转换: 隐式类型转换 和 显式类型转换

  • 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  • 显式类型转化:需要用户自己处理

隐式类型转化只有类型相近的时候才会发生,比如 int 和 double,而指针和 int之间则需要显示类型转化。

int main()
{int i = 1;// 隐式类型转换double d = i;printf("%d, %.2f\n", i, d);int* p = &i;// 显示的强制类型转换int address = (int)p;printf("%x, %d\n", p, address);return 0;
}

缺陷:

  • 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

volatile关键字 修饰const变量

如下代码中,对const变量的值进行修改

int main()
{const int n = 10;// 转换有安全隐患的int* p = (int*)&n;(*p)++;//n = 11;cout << n << endl;cout << *p << endl;cout << p << endl;return 0;
}

在这里插入图片描述
可以看到我们对const变量n 的值进行了修改,但是我们访问n的时候发现它的值却是不变的。

为什么没有达到我们预期的结果呢??
我们从汇编的角度可以看到,编译器对const变量n直接用10进行了替换并没有实际访问变量n的内存,因此我们访问n的时候它的值依然是10.
在这里插入图片描述

那么我们如何达到我们预期的效果呢?即编译器能对const修饰的变量访问它的内存
十分简单,只需要在const变量前加上volatile即可

int main()
{// volatile 修饰的变量,每次都要去内存取volatile const int n = 10;//n = 11;// 转换有安全隐患的int* p = (int*)&n;(*p)++;cout << n << endl;cout << *p << endl;cout << p << endl;return 0;
}

运行结果如下:
在这里插入图片描述

(二)C++四种强制类型转换

C风格的转换格式很简单,但是有不少缺点的:

  1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  2. 显式类型转换将所有情况混合在一起,代码不够清晰

因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast

1. static_cast

static_cast用于非多态类型的转换(静态转换)通俗点说就是相近类型之间的转换编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。

**int main()
{double d = 12.34;int a = static_cast<int>(d);cout<<a<<endl;return 0;
}
**

2. reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。通俗点说就是用于两个不相关类型之间的转换

int main()
{int a = 10;// 这里使用static_cast会报错,应该使用reinterpret_cast//int *p = static_cast<int*>(a);int* p = reinterpret_cast<int*>(a);return 0;
}

3. const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值

int main()
{volatile const int a = 2;int* p = const_cast<int*>(&a);*p = 3;cout << a << endl;return 0;
}

注意volatile关键字的使用。

4. dynamic_cast

dynamic_cast用于将一个父类对象的指针(或引用)转换为子类对象的指针(或引用)

向上转型和向下转型:

  • 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
    就是切割/切片,语法支持。
  • 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

注意:

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

若pa指向子类对象B,则转换成功,正常返回地址,若pa指向父类对象A,则转换
失败,返回空指针

class A
{
public:virtual void f() {}
};
class B : public A
{};
void fun(A* pa)
{// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回B* pb1 = (B*)(pa); //不安全B* pb2 = dynamic_cast<B*>(pa);cout << "pb1:" << pb1 << endl;cout << "pb2:" << pb2 << endl;cout << "----------------" << endl;
}
int main()
{A a;fun(&a);B b;fun(&b);return 0;}

B* pb1 = (B*)(pa); //不安全
为什么这样转换是不安全的??
因为当pa指向的是父类的对象时,该转换依然会有地址返回,这样是不安全的。

dynamic_cast只能用于含有虚函数的类,因为运行时类型检查需要运行时的类型信息,而这个信息是存储在虚函数表中的,只有定义了虚函数的类才有虚函数表。

总结

强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。强烈建议:避免使用强制类型转换

(三)RTTI

RTTI:Run-time Type identification的简称,即:运行时类型识别。

C++通过以下方式来支持RTTI:

  • typeid运算符 : 在运行时识别出一个对象的类型。
  • dynamic_cast :在运行时识别出一个父类的指针(或引用)指向的是父类对象还是子类对象。
  • decltype:在运行时推演出一个表达式或函数返回值的类型。

文章转载自:

http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://00000000.kqzxk.cn
http://www.dtcms.com/wzjs/616233.html

相关文章:

  • 做网站看百度脸色轻松学做网站
  • 切图网站建设专业开发网站企业
  • 微网站难做么搜索引擎排行榜
  • 基于淘宝联盟的返利网站怎么做动易网站 青春
  • 如何做品牌推广网站WordPress程序APP制作
  • 网站建设工作小组分工官网好看的公司
  • 网站招工费怎么做会计分录雄安免费网站建设方案
  • 资兴市网站建设哪个好做第一个php网站
  • wordpress文章添加阅读全文北京优化网站方法
  • 戴尔的网站建设有哪些主要特色新浪短网址生成器
  • 广州天河区网站设计公司网站开发一般用什么工具
  • 淘客网站开发流程深圳企业电话黄页
  • 江苏推广网站建设业务pc 手机网站建设
  • php网站开发 薪资 东莞域名管理
  • 腾讯云域名如何建设网站广州管网建设
  • 收费网站怎么制作郑州网站建设网站
  • 甜品店网站建设看公狍和女人做爰网站
  • 沙田镇做网站广东省建设教育协会官方网站首页
  • 招聘网站如何建设网站院长信箱怎么做
  • 做网站客户最关心的是什么客户关系管理定义
  • 网站改版 百度影响上海建网站手机app
  • 网站建设报价单电子商务网站软件建设的
  • 手机网站 软件什么网站可以做美食
  • 网站你懂我意思正能量晚上不用下载wordpress4.6.9
  • 狮山建网站m8+wordpress主题
  • 少儿美术网站建设方案天津信息港
  • 手机营销型网站建设网站开发服务 税
  • 国外网站排行aspnet网站开发pdf
  • 建造师免费自学网站重庆网站建设首选承越
  • 布吉网站的建设智慧旅游景区网站建设