C++/h.文件中的参数

C++/ arguments in h. file

本文关键字:参数 文件 C++      更新时间:2023-10-16

我读了一本书,其中给出了.h文件的例子,它等于java中的队列接口:

void InitQueue(Queue* pQueue, int iSize);
bool Insert(Queue* pQueue, const Item* pItem);
bool Extract(Queue* pQueue, Item** pItem);
bool GetFirst(const Queue* pQueue, Item** pItem);
bool IsFull(const Queue* pQueue);
bool IsEmpty(const Queue* pQueue);

我不明白两件事:

  1. 为什么在Extract, GetFirst第二个参数是类型 Item** 而不是 Item* ?当我们做这样的事情时,是什么意思?
  2. 为什么在某些函数(IsFull, IsEmpty,.)中我们得到参数const Queue*而不是简单的Queue*

IsFull() 和 IsEmpty() 采用 const 参数,因为这意味着它们不会更改 Queue 对象;它是常量,不会被修改。

Extract 和 GetFirst 使用 **,因为:

int a;           // Declares an int
a = 2;           // Sets a to 2
int *b = &a;     // Declares a pointer pointing to that int
*b = 4;          // Sets a to 4
int **c = &b;    // Declares a pointer pointing to that pointer to that int
**c = 6;         // Sets a to 6

如果我将 c 传递给一个函数:

int global_var;
int main() {
  modify_ptr(c);
}
void modify_ptr(int **ptr)
{
  *ptr = &global_var;
}

我刚刚传入的指针本身被修改了;**c 现在指向 global_var 而不是 a。

将这些指针传递到 getfirst 和 extract 的原因是因为这些是"getter"函数 - 您希望它们返回指向数据的指针。因此,它们需要能够返回指针,并且它们采用的方法是将指针传递给指针,如上例所示,以便它们可以修改您传递给它们的内容以指向正确的元素。

为什么在Extract中,GetFirst第二个参数是类型 Item** 而不是 Item* ?当我们写这样的东西时是什么意思?

以便可以在函数内部更改指针。
最有可能的是,这意味着Item指针将由调用方传递,但将在函数内部分配。不能仅通过按值传递指针来执行此操作,因为这会将内存分配给指针的副本,而不是要传递的原始指针。

很难说为什么程序员使用调用者传递指针和函数分配指针的语义。理想情况下,人们会期望一个源-接收器机制。

为什么在某些函数(IsFullIsEmpty,.)中我们得到参数const Queue*而不是简单的Queue*

为了常量的正确性
它向函数的用户指示指向的数据不会在函数内部更改。

为什么在提取中,GetFirst 第二个参数的类型是 Item** 而不是 Item*?当我们做这样的事情时,是什么意思?

这些是输出。队列显然包含一堆指向项目的指针。由于它是一个指针,我会做ExtractGetFirst只接受一个参数并返回一个指针。空指针表示失败。开发人员不是这样做的。相反,他们使用了一种旧的C式范式。为什么?谁知道呢。这不是编写这些内容的最佳方式。

为什么在某些函数(IsFull,IsEmpty等)中,我们得到参数const Queue*而不是简单的Queue*?

将参数标记为const告诉代码的用户,该函数不会对参数的内容执行任何操作。将此类不受干扰的引用和指针参数标记为const是一种很好的编程做法。