C++类型安全

C++是不是类型安全的? 不是。因为两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。 阅读详情

什么是类型安全?

类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。

C语言的类型安全

C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将会报告错误,除非使用显式类型转换。然而,C中相当多的操作是不安全的。以下是两个十分常见的例子:

(1)printf格式输出

  1. /* - print.cpp 
  2.  * version:1.1 
  3.  */  
  4. int main()  
  5. {  
  6.     printf("%d\n",10);  
  7.     system("pause");  
  8.     return 0;  
  9. }  

上面的代码很简单,printf函数中,%d与10匹配,结果正确。

稍作修改:

  1. /* - print.cpp 
  2.  * version:1.2 
  3.  */  
  4. int main()  
  5. {  
  6.     printf("%f\n",10);  
  7.     system("pause");  
  8.     return 0;  
  9. }  

%f浮点数与10并不匹配,但是编译通过,执行也没报错,但是结果却是:

0.000000
请按任意键继续. . .
更进一步,把%f修改为%s,编译通过,执行将报错Access Violation。

(2)malloc函数的返回值

malloc是C中进行内存分配的函数,它的返回类型是void*即空类型指针,常常有这样的用法char* pStr=(char*)malloc(100*sizeof(char)),这里明显做了显式的类型转换。类型匹配尚且没有问题,但是一旦出现int* pInt=(int*)malloc(100*sizeof(char))就很可能带来一些问题,而这样的转换C并不会提示错误。

C++的类型安全

如果C++使用得当,它将远比C更有类型安全性。相比于C,C++提供了一些新的机制保障类型安全:

(1)操作符new返回的指针类型严格与对象匹配,而不是void*;

(2)C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;

(3)引入const关键字代替#define constants,它是有类型、有作用域的,而#define constants只是简单的文本替换;

(4)一些#define宏可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板也能保证类型安全;

(5)C++提供了dynamic_cast关键字,使得转换过程更加安全,因为dynamic_cast比static_cast涉及更多具体的类型检查。

即便如此,C++也不是绝对类型安全的编程语言。如果使用不得当,同样无法保证类型安全。比如下面两个例子:

  1. int i=5;  
  2. void* pInt=&i;  
  3. double d=(*(double*)pInt);  
  4. cout<<d<<endl;  

输入结果不是5,而意想不到的结果:-9.25596e+061。又比如:

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Parent  
  5. {  
  6. };  
  7. class Child1:public Parent  
  8. {  
  9. public:  
  10.     int i;  
  11.     Child1(int e):i(e)  
  12.     {  
  13.     }  
  14. };  
  15. class Child2:public Parent  
  16. {  
  17. public:  
  18.     double d;  
  19.     Child2(double e):d(e)  
  20.     {  
  21.     }  
  22. };  
  23. int main()  
  24. {  
  25.     Child1 c1(5);  
  26.     Child2 c2(4.1);  
  27.     Parent* pp;  
  28.     Child1* pc1;  
  29.   
  30.     pp=&c1;  
  31.     pc1=(Child1*)pp;  //#1 强制转换,由于类型仍然为Child1*,不造成错误  
  32.     cout<<pc1->i<<endl;  
  33.   
  34.     pp=&c2;  
  35.     pc1=(Child1*)pp;  //#2 强制转换,且类型发生变化,将造成错误  
  36.     cout<<pc1->i<<endl;  
  37.     system("pause");  
  38.     return 0;  
  39. }  

结果如下:

5
1717986918
请按任意键继续. . .

上面两个例子之所以引起类型不安全的问题,是因为程序员使用不得当。第一个例子用到了空类型指针void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序的类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针做强制转换。

对C++不是类型安全语言的理解 参见脚本之家:http://www.jb51.net/article/37847.htm   在C++中,可以把0当成bool类型的false,也可以当做int中的数字0.则表示C++不是类型安全语言。   类似的,MFC中的CString也不是类型安全的类。因为其他类型的数据可以通过CSting中的成员函数Format转换成CString。   1 #include<iostream>   2   3 using namespace std;   4   5  bool fun()//函数返回类型是bool,但是我们在函数中可以返回int类型。   6  {   7     立即下载

相关推荐

数据库decimal类型详解:精度、标度与金额计算避坑指南

在关系型数据库中,浮点数精度丢失是常见问题,尤其涉及金额计算时,一分钱误差都可能导致对账失败。decimal类型通过十进制存储方式,将小数当作定点数处理,避免了二进制转换误差,确保运算结果精确。其核心在于精度和标度的合理定义,以及运算舍入规则的控制。在电商订单、汇率转换、税务计算等场景中,decimal是保障数据准确性的关键技术。理解其存储原理和实操细节,能有效规避隐式转换、聚合函数精度等常见坑点,提升系统可靠性。

weixin_32050773的博客 270

谈谈C++类型安全

什么是类型安全? 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿

btwsmile's blog 1万+

局域网ip冲突检测工具_python 小工具实现 windows笔记本与 ipad数据互传

宅在家没事的时候就开始琢磨ipad的进阶使用,由于没有mac无法隔空投送,ipad与windows的数据交互表现极差,所以设计了这个ftp小工具。当然,这个工具不仅仅能用于windows与ipad,还可以用于局域网任意两台设备之间程序源码与下载见文章末尾使用说明windows端:biubiubiu.exeipad端: appsotre下载 FE文件管理器windows端操作在c盘下创建ftp目录...

weixin_39866265的博客 4435

类型安全与不安全演示

C/C++是类型不安全的语言,允许数组下标越界

howard2005的专栏 1574

尚硅谷课程【笔记】——大数据之Shell【一】

【【尚硅谷】Shell脚本从入门到实战】笔记

n04j04h06的博客 1318

【项目立项管理、项目整合管理】30天通过软考高项-第二天

①项目或阶段的概述;②范围目标、范围的评估标准,证明达到完⼯标准的证据;③质量目标、项目和产品质量的评估标准、相关核实信息和实际里程碑交付日期以及偏差原因;④成本目标,包括可接受的成本区间、实际成本,产⽣任何偏差的原因等;⑤最终产品、服务或成果的确认信息的总结;⑥进度计划目标,包括成果是否实现项目预期效益:如果在项目结束时未能实现效益,则指出效益实现程度并预计未来实现情况;

weixin_42520723的博客 1000

什么是类型安全?

好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。因此,想保证程序的类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针做强制转换。C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将会报告错误,除非使用显式类型转换。(4)一些#define宏可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板也能保证类型安全;

m0_47771636的博客 371

Unity抖音小游戏上架实战:从零到一,详解流程与避坑指南

本文详细介绍了Unity抖音小游戏上架的全流程,包括环境准备、SDK集成、开发者账号注册、软著申请、打包提交流程及常见问题解决方案。重点解析了抖音小游戏平台特有的配置细节和避坑技巧,帮助开发者高效完成游戏上架并优化用户体验。

weixin_33704234的博客 261

什么是类型安全,C/C++是类型安全的吗?

【1】首先:C/C++不是类型安全的语言。类型安全是指同一段内存在不同的地方,会被强制要求使用相同的办法来解释(内存中的数据是用类型来解释的)。 //类型安全性意味着编译器将在编译时验证类型,如果尝试将错误的类型分配给变量,则抛出错误。 Java语言是类型安全的,除非强制类型转换。 C语言不是类型安全的,因为同一段内存可以用不同的数据类型来解释,比如1用int来解释就是1,用boolean来解释就是true。 ------------------------------------------------

qfturauyls的博客 6425

linux下docker 部署onlyoffice社区版

Onlyoffice 是一款功能丰富的在线 Office 工具,类似 WPS 和 微软的 Office 套件。OnlyOffice Workspace 是由 OnlyOffice 推出的基于云计算的企业级在线协作办公平台,由文档服务(Document Server)、控制面板(Control Panel)、社区服务(Community Server)和邮件服务(Mail Server)四个组件构成,提供了文档、项目、成员、邮件等功能模块,支持文档多人协作、历史版本控制等功能,旨在帮助用户提高工作效率和工作质

axiaowua的博客 2382

基于 Arduino 的鱼缸水质检测控制系统设计

本系统通过多传感器实时采集鱼缸水质参数(pH 值、温度、溶解氧、浊度),经 Arduino 主控芯片处理后,驱动执行模块自动调节水质,并通过显示模块实时展示数据。系统具备阈值报警、自动换水、温度调节、增氧等功能,适用于家庭或小型水族箱的水质智能管理。本设计提供了低成本、易扩展的鱼缸水质管理方案,适用于家庭水族箱或小型水产养殖场景,可根据实际需求调整传感器类型和控制逻辑。注:本设计如有疑问需要解惑可直接私信本人,看我个人简介。

weixin_42300449的博客 1086

c++ 类型安全

1、什么是类型安全 类型安全简单来说就是访问可以被授权访问的内存位置,类型安全的代码不会试图访问自己未被授权的内存区域。一方面,类型安全被用来形容编程语言,主要根据这门编程语言是否提供类型安全的保障机制;另一方面,类型安全也可以用来形容程序,根据这个程序是否隐含类型错误。类型安全的语言和程序之前,其实没有必然的联系。类型安全的语言,使用不当,也可能写出来类型不安全的程序;类型不安全的语言,使用得...

silence_lu_的博客 1839

若依框架二次开发——RuoYi-AI 本地部署流程

若依框架二次开发——RuoYi-AI 本地部署流程

bjzhang75的博客 1783

C/C++的类型安全

什么是类型安全? 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿

qinbiao2007的专栏 486

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C与C++类型安全机制深度对比

本文对比了C和C++语言在类型安全机制上的差异。C语言类型检查较宽松,允许隐式转换和void指针,依赖程序员手动管理类型安全;C++通过严格的类型检查、安全转换操作符、模板、强类型枚举等机制增强类型安全性。在实践方面,建议C语言使用显式转换并避免野指针,而C++推荐使用智能指针和引用。总结指出,C语言适合系统编程等场景但需程序员自律,C++则通过语言机制提供更高类型安全性,适合大型应用开发。合理运用C++现代特性可显著降低类型相关错误风险。

弘羽 858

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++ 类型安全

什么是类型安全? 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一

雄鹰 工作室 755

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java是类型安全的语言,而C++是非类型安全的

有过C++开发经验的人会发现,我们可以将0作为false,非零作为true。一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true。代码实例如下: 1 #include 2 #include 3 using namespace std; 4 5 bool fun()//函数返回类型是bool,但是我们在函数中可以返回i

nhf_a的博客 615

C++ 是类型安全的语言吗?

C++ 是类型安全的语言吗?C++。虽然它在大多数情况下支持强类型检查(如禁止不同类型的变量之间直接赋值),但也允许程序员通过某些方式绕过类型系统,从而破坏类型安全。

陈子青的博客 323

C++-类型安全模块

类型安全简单来说就是访问可以被授权访问的。

Asincereman的专栏 452

什么是类型安全? (C和C++类型安全比较)

什么是类型安全? 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的...

a3192048的博客 1万+

C++不是类型安全的语言

在C++语言中,下列说法正确的是: 正确答案: D   你的答案: 空 (错误) inline函数表示编译器一定会将函数体直接插入到调用此函数的地方,这样可以加快程序的运行速度 局部变量和全局变量不能重名 静态局部变量内存是在运行期分配的,存储在堆栈区 C++不是类型安全的语言 添加笔记 收藏 纠错

chengonghao的博客 5365

C++编程规范 类型安全

类型安全 返回 目录 返回《C++ 编程规范及惯用法》

早晨的阳光 的技术博客 736
上一篇: C/C++笔试题-主要考察C/C++语言基础概念、算法及编程
下一篇: 查找字符串
deadcodeye
博客等级 码龄17年 8粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值