我们在c++中强制使用指针的场景

Scenarios where we force to use Pointers in c++

本文关键字:指针 c++ 我们      更新时间:2023-10-16

我在一次采访中被要求在CPP中给出一个例子或场景,在这个例子或场景中,我们不能在没有指针的情况下继续,这意味着我们必须使用指针。我举了一个函数返回数组的例子,这个数组的大小是未知的,然后我们需要返回一个指针,这个指针是数组的名称,实际上是一个指针。但这位采访者说,它内部的数组举了一些其他的例子。

所以,请帮我处理一些同样的其他场景。

如果您使用的C库具有返回指针的函数,则必须使用指针,而不是引用。

还有许多其他情况(例如,显式处理内存(,但我首先想到的是这两种情况:

链接的数据结构

方法:您需要在多个位置引用结构的各个部分。您使用指针来实现这一点,因为容器(也在内部使用指针(并不能满足您的所有数据结构需求。例如,

  class BinTree {
      BinTree *left, *right;
  public:
      // ...
  };

为什么没有替代方案:标准中没有通用树实现(不包括排序实现(。

指向实现模式的指针(pimpl(

如何:您的公共.hpp文件具有方法,但仅通过不透明的Whatever *引用内部状态;而您的内部实现实际上知道这意味着什么,并且可以访问它的字段。请参阅:pImpl这个成语真的在实践中使用过吗?

为什么别无选择:如果您以纯二进制形式提供实现,则标头的用户在不进行反编译/反向工程的情况下无法访问内部。这是一种更强的隐私形式。

任何你想使用引用的地方,但必须允许null

这在库中很常见,如果您传递非零指针,它将被设置为值

对于将被更改为使用指针的函数,使用参数也是一种惯例,而不是引用来强调可以将值更改为用户。

以下是一些情况:

  • 使用寿命长的对象。您在函数中创建了一些对象。之后您需要这个对象(甚至不需要它的副本(。但是,如果您在没有指针的情况下创建它,那么在函数完成后的堆栈上,这个对象就会死亡。所以您需要使用动态内存创建这个对象,并返回指向它的指针

  • 堆栈空间不足。您需要的对象需要大量内存,因此在堆栈上分配它不符合您的需求,因为堆栈的空间通常比堆小。因此,您需要使用堆上的动态内存再次创建对象,并返回指向它的指针

  • 您需要引用语义。你有一个传递给某个函数的结构,你希望函数修改这个结构,在这种情况下,你需要传递一个指向这个结构的指针,否则你无法修改原始结构,因为如果你不使用指针,它的副本将传递给函数。

注意:在后一种情况下,实际上不需要使用指针,因为您可以使用引用来替换它。

PS。您可以在这里浏览更多的场景,并决定在哪些情况下需要使用指针。

指针对性能很重要,例如函数。最初,当您在函数中传递值时,它会从参数中复制值并存储到参数中但在指针中,您可以间接访问它们,并执行您想要的