为什么c ++允许指针,如果它们可以产生访问私有成员等问题?

时间:2018-06-17 19:16:21

标签: c++ oop pointers private

我已经阅读了 c ++指针及其缺陷,其中一个是可以使用指针攻击<{3>访问其他类对象的私有数据成员 {{3 }和here。 当然,c ++中的指针为语言提供了很大的灵活性,但是如果它可以阻碍语言的核心OOP功能,如数据隐藏,会有什么用?这真的是安全&amp; 灵活性

3 个答案:

答案 0 :(得分:6)

C ++首先是一种低级语言,它使用更高级的语言结构扩展了传统的C语言。没有什么例外,没有删除任何内容。

C ++不仅仅是一种OO语言。它是功能性的,声明性的,程序性的,结构化的面向对象的。它甚至可以用作便携式汇编程序,就像C经常使用的那样。

在CPU访问内存的方式上,指针是一个很薄的抽象。能够访问原始指针in-language可以实现大量高效的代码。每种系统编程语言都允许访问原始指针;有时被“不安全”的街区所保护;和C ++也是一种系统编程语言。

如果您从单一角度来看C ++,并想知道为什么它的目标看起来很奇怪,请尝试从另一个方向看它。

答案 1 :(得分:4)

C ++最初是基于C语言构建的。它添加功能而不删除任何功能。 C有指针,因此C ++有指针。与C接口的兼容性仍然是C ++的基本特性。因此,指针永远不会不允许

除兼容性外,指针非常有用。将面向对象编程引入系统编程语言是C ++的最初原因,应该注意间接对于实现运行时多态性至关重要。当然,在C ++中有另一种间接方法 - 引用,但引用更有限,不能用于实现需要使用指针的所有算法。

指针也需要实现基于节点的数据结构,例如树或链表。

  

c ++指针以及它们的缺陷,其中之一就是可以访问其他类对象的私有数据成员,使用指针hack here

这个技巧不是由指针启用,而是使用reinterpret_cast。对于为什么允许语言功能进行质疑会更加明智。

  

here

这个和前一个都是语言允许打破封装的情况。问题不在于指针。问题是C ++ - 比如C - 在违反某些规则时会有未定义的行为(UB)。

你可能想知道,为什么一种语言有UB。答案是如果要求在运行时检查规则以避免UB,那么当我们假设程序没有出错时,程序必然会慢得多。由于C和C ++是低级系统编程语言,因此选择性能的代价是防止糟糕的程序员。

答案 2 :(得分:0)

没有涉及安全的权衡。那是因为没有什么可以交易,因为C ++不提供安全性。该语言提供工具(如数据隐藏)和编译器提供护栏(大多数警告),以帮助您做正确的事情,但如果您决定在您的程序中做错事,您可以自由地这样做。 Vivelarésistance! 观看程序崩溃覆盖刻录。

此外,如果您想访问私有成员,有一个更简单的方法,不涉及未定义的行为:编辑头文件,并将“private”更改为“public”或将您的班级/职能添加为friend。 (我不确定这是否会影响ABI。您可能需要重新编译库。我说“更简单”而不是“更快”。)没有涉及指针。