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



我已经读过关于 c++ 指针及其陷阱的文章,其中之一是可以使用指针黑客访问其他类对象的私有数据成员,如此处和此处所述。 当然,c ++中的指针为语言提供了很大的灵活性,但是如果它可以阻碍语言的核心OOP功能(如数据隐藏(,它有什么用呢?这真的是安全性和灵活性之间的权衡吗?

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

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

指针是 CPU 访问内存方式之上的精简抽象。 以语言访问原始指针可以实现大量高效的代码。 每种系统编程语言都允许访问原始指针;有时由"不安全"的块守卫;C++也是一种系统编程语言。

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

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

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

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

C ++指针及其陷阱,其中之一是可以使用指针hack访问其他类对象的私有数据成员,如此处所述

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

和这里

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

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

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

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

最新更新