为了账号安全,请及时绑定邮箱和手机立即绑定

C++是不是类型安全的

C++是不是类型安全的

C++
慕森卡 2018-07-29 12:13:01
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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++也不是绝对类型安全的编程语言。如果使用不得当,同样无法保证类型安全。比如下面两个例子:
int i=5;
void* pInt=&i;
double d=(*(double*)pInt);
cout<<d<<endl;

输入结果不是5,而意想不到的结果:-9.25596e+061。又比如:
#include<iostream>
using namespace std;

class Parent
{
};
class Child1:public Parent
{
public:
int i;
Child1(int e):i(e)
{
}
};
class Child2:public Parent
{
public:
double d;
Child2(double e):d(e)
{
}
};
int main()
{
Child1 c1(5);
Child2 c2(4.1);
Parent* pp;
Child1* pc1;

pp=&c1;
pc1=(Child1*)pp; //#1 强制转换,由于类型仍然为Child1*,不造成错误
cout<<pc1->i<<endl;

pp=&c2;
pc1=(Child1*)pp; //#2 强制转换,且类型发生变化,将造成错误
cout<<pc1->i<<endl;
system("pause");
return 0;
}

结果如下:
5
1717986918
请按任意键继续. . .

查看完整回答
反对 回复 2018-08-01
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

首先,类型安全代码指 访问被授权可以访问的内存位置。C++的指针操作是可以访问任何地址的,包括那些属于系统底层的文件。C/C++可以直接操作硬件,比如Windows系统都是C/C++写的,所以就单单这门语言而言,它不是类型安全的。

查看完整回答
反对 回复 2018-08-01
  • 2 回答
  • 0 关注
  • 1413 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信