C++ 对类型安全的好处感到困惑吗

C++ 对类型安全的好处感到困惑吗,c++,C++,我试图了解类型安全的好处是什么。但我有点困惑 根据我对类型安全性的理解,类型安全性可以防止混合不兼容的数据类型。例如,不能将char*分配给int*: char c = 'a'; int *p = &c; // this is not allowed (compiler error) 现在我猜不允许这样一个赋值的好处是,如果我尝试去引用p,我将访问不允许访问的3个额外字节 但是在C++中,我可以做如下:< /P> int *p; // I don't have to

我试图了解类型安全的好处是什么。但我有点困惑

根据我对类型安全性的理解,类型安全性可以防止混合不兼容的数据类型。例如,不能将
char*
分配给
int*

char c = 'a';
int *p = &c;    // this is not allowed (compiler error)
现在我猜不允许这样一个赋值的好处是,如果我尝试去引用
p
,我将访问不允许访问的3个额外字节

<>但是在C++中,我可以做如下:< /P>
int *p;        // I don't have to initialize p, and so it will have some junk/random value
*p = 12345;    // this will probably lead to segmentation fault!

所以基本上在最后一个例子中,我被允许做类型安全性在第一个例子中试图阻止的行为!我是不是遗漏了什么

>允许,因为C++不跟踪变量是否初始化;您的示例与类型安全无关(在那里没有类型的不兼容)

,因为C++不跟踪变量是否初始化,所以该事件是允许的;您的示例与类型安全无关(在那里没有类型的不兼容)

我想您是问C++是否可以保护我免于一些错误,为什么不都是错误呢?它可以防止你犯明显的错误,但它不能防止你犯每一个错误。然而,除了错误,它也给出了很多警告。在你的例子中,我得到了一个警告:

warning C4700: uninitialized local variable 'p' used    
编译器可以看到您在进行赋值之前没有初始化
p


我工作过的大多数地方都坚持所有警告在发布之前都是固定的,这是一个很好的策略——将所有警告都视为错误

>我想你问C++是否能保护我免于一些错误,为什么不是所有的错误?它可以防止你犯明显的错误,但它不能防止你犯每一个错误。然而,除了错误,它也给出了很多警告。在你的例子中,我得到了一个警告:

warning C4700: uninitialized local variable 'p' used    
编译器可以看到您在进行赋值之前没有初始化
p


我工作过的大多数地方都坚持所有警告在发布之前都是固定的,这是一个很好的策略——将所有警告都视为错误

C++是一种复杂的语言,多年来由许多人设计,因此不可能找到一个清晰的设计方向

<> P>一个原始思想是不允许在C++和汇编程序之间提高速度,因此大多数部分的语言牺牲了安全性,因为这暗示了性能开销。
“错误类型”的使用是在编译时完成的,在运行时没有成本。相反,检查未初始化变量(或大多数其他语言中禁止使用的未初始化变量)的使用将需要运行时成本惩罚,因此它被忽略了。

C++是一种复杂的语言,多年来由许多人设计,因此不可能找到一个干净明确的设计方向

<> P>一个原始思想是不允许在C++和汇编程序之间提高速度,因此大多数部分的语言牺牲了安全性,因为这暗示了性能开销。

“错误类型”的使用是在编译时完成的,在运行时没有成本。检查是否使用未初始化变量(或大多数其他语言中禁止使用的未初始化变量)需要运行时成本惩罚,因此被忽略。

第二个示例公开了未定义的行为,与类型安全无关。第二个示例取消引用未初始化的指针。这是未定义的行为,因为
p
指向任意内存位置。如果第一个问题已经有答案和相关命令,为什么要问两个几乎相等的问题?您缺少将
int
12345
)写入
int
*p
)的事实,因此表达式是完全类型安全的。问题与类型安全无关。第二个示例公开了未定义的行为,与类型安全无关。第二个示例反引用了未初始化的指针。这是未定义的行为,因为
p
指向任意内存位置。如果第一个问题已经有答案和相关命令,为什么要问两个几乎相等的问题?您缺少将
int
12345
)写入
int
*p
)的事实,因此表达式是完全类型安全的。这个问题与类型安全无关。我回复的注释已经消失了,为什么编译器在编译时很难检测到未初始化的变量,它不是已经在检测并显示警告了吗?!是的,它可以检测到这一点,并发出警告-我很惊讶这只是一个警告,但显然C++11标准不要求在这种情况下引发错误。但是,只要将所有警告视为“错误”-它们会提醒您可疑代码。@Tom:检测未初始化变量的使用通常是一个很难解决的问题(我认为很难)。编译器所做的是抱怨使用了“可能”未初始化的变量。。。通常很有用,但有时很烦人,因为他们不明白他们担心的事情不会发生。没错-我考虑的是局部变量,但编译器通常不可能检测到带有外部链接的全局指针是否已初始化,因为它可以从任何地方访问。我回复的注释已经消失了,为什么编译器在编译时很难检测到未初始化的变量,它不是已经这样做并显示警告了吗?!是的,它可以检测到这一点,并发出警告-我很惊讶这只是一个警告,但显然C++11标准不要求在这种情况下引发错误。不过,只要将所有警告视为“错误”——它们会提醒您怀疑