如果指针会产生访问私有成员等问题,为什么 C++ 允许指针?

why c++ allows pointers if they can generate problems like accessing private members?

我读过 c++ 指针 及其陷阱,其中之一是可以访问其他 [=] 的私有数据成员 23=] 对象使用提到的指针 hacks here and here。 当然,c++ 中的指针为语言提供了很大的灵活性,但如果它会妨碍语言的核心 OOP 功能,如 data hiding,那么它有什么用呢?这真的是 安全性 灵活性 之间的权衡吗?

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

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

指针是对 CPU 如何访问内存的一种精简抽象。以语言访问原始指针可以生成大量高效的代码。每种系统编程语言都允许访问原始指针。有时由 "unsafe" 块守卫; C++也是一种系统编程语言。

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

C++最初是建立在C语言之上的。它添加了功能而没有删除任何功能。 C有指针,因此C++也有指针。与 C 接口的兼容性仍然是 C++ 的基本特性。因此,指针将永远 不允许

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

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

c++ pointers and their pitfalls, one of which is that one can access private data members of other class objects using pointer hacks as mentioned here

这个技巧不是通过指针启用的,而是通过使用 reinterpret_cast 启用的。质疑为什么 that 语言功能被允许会更明智。

and here

这两种情况和之前的情况都是语言不允许 允许破坏封装的情况。问题不在于指针。问题是 C++ - 像 C - 在违反某些规则时具有 未定义的行为 (UB)。

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

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

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