首页 > 试题广场 >

C++是不是类型安全的?

[单选题]
C++是不是类型安全的?
  • 不是
推荐
B
    C++中我们可以将0作为false,非零作为true。一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true。
  java中int类型不能在自动转变成bool类型了。这就是类型安全的意思。
编辑于 2015-01-02 11:01:01 回复(1)
类型之间可以进行强制转换 表示类型不安全。
发表于 2015-06-08 10:10:28 回复(2)
什么是类型安全?

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

C语言的类型安全

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

(1)printf格式输出

/* - print.cpp
 * version:1.1
 */
int main()
{
	printf("%d\n",10);
	system("pause");
	return 0;
}

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

稍作修改:

/* - print.cpp
 * version:1.2
 */
int main()
{
	printf("%f\n",10);
	system("pause");
	return 0;
}

%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++也不是绝对类型安全的编程语言。如果使用不得当,同样无法保证类型安全。比如下面两个例子:

	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
请按任意键继续. . .

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

发表于 2017-07-20 09:13:17 回复(0)
B。
C++的指针操作是可以访问任何地址的,包括那些属于系统底层的文件。 C/C++可以直接操作硬件,比如Windows系统都是C/C++写的,所以就单单这门语言而言,它不是类型安全的。
发表于 2022-02-27 11:37:53 回复(0)
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。
发表于 2014-10-25 00:26:12 回复(0)
类型安全指,类型转换会不会出错。有两种途径保证类型转换不出错,第一种很严格的限制转换、甚至不允许隐式转换,第二种,对所有合乎语法的转换进行检查以免出错。C++不是类型安全的,从某种意义上说,C++足够信任程序员,以至于相信你考虑到了这种转换并且有意为之。
发表于 2020-10-03 23:05:21 回复(0)
答案:B
C++不是类型安全的,java和C#是类型安全的
发表于 2015-01-26 11:05:00 回复(0)
类型之间可强制转换,表示类型不安全
发表于 2022-02-10 10:04:25 回复(0)
类型安全不能自动转换。 c++ bool a = 0 会自动转 不安全 java 类型安全 不可以自动转
发表于 2021-04-02 10:18:17 回复(0)
做错了,题目有问题
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涉及更多具体的类型检查。
发表于 2017-06-06 10:43:16 回复(0)
B
C++不是类安全的

发表于 2015-01-18 15:59:17 回复(0)
B
发表于 2015-01-08 17:27:39 回复(0)
c c++都不是类型安全的,不过c++相对安全的
发表于 2024-09-10 19:31:02 回复(0)

类型安全是指编程语言或程序开发方式能够保证数据的正确类型在特定上下文中使用。在类型安全的语言中,变量、函数或表达式可以在编译时间或运行时被检查其数据类型,以确保它们仅与兼容类型的对象进行操作,并且不会引起意外的类型转换或数据损坏。

具有类型安全的代码可以减少由于类型错误造成的bug,提高代码的可理解性和可维护性,从而提高代码的质量、可靠性和安全性。另外,类型安全还可以帮助保护软件安全,防止因类型不匹配而导致的缓冲区溢出攻击和其他安全漏洞。

C++是一种静态类型的编程语言,在编译期间对数据类型进行检查,以确保应用程序在运行时能够正常运行。然而,C++内置了一些能够绕过类型检查的机制,例如类型转换等,因此,在使用C++编写应用程序时要注意类型安全,避免程序出现类型错误。

发表于 2023-10-18 21:43:59 回复(0)
类型之间可以进行强制转换 表示类型不安全。

C++中我们可以将0作为false,非零作为true。一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true。
  java中int类型不能在自动转变成bool类型了。这就是类型安全的意思。

发表于 2018-06-02 08:33:41 回复(0)
若类型间可进行类型转换,则表明该类型是不安全的
C++中可进行类型转换,则C++是类型不安全的
发表于 2017-07-25 22:26:50 回复(0)
类型之间可以进行强制转换 表示类型不安全。

发表于 2017-05-02 16:11:34 回复(0)

类型安全就是说,同一段内存,在不同的地方,会被强制要求使用相同的办法来解释(interpret);
-----------------来自知乎

发表于 2017-04-05 10:58:55 回复(0)
C/C++/Java都不是类型安全的
发表于 2016-08-24 18:50:15 回复(0)
C++中如果bool类型可能直接转换成int类型,这就是类型不安全的例子。
发表于 2016-05-21 13:02:18 回复(0)
c++中存在非void*类型的向void*类型的自动转换,类型不安全,如果规定两种不同类型之间必须通过显示转换则是安全的。
比如:
int i = 3;
int* q = &i;
void* p = q;
类型不安全
编辑于 2015-09-21 14:20:50 回复(0)