需要对C++代码进行解释

Need explanation for C++ code

本文关键字:解释 代码 C++      更新时间:2023-10-16
namespace Stack {
  struct Rep; // definition of stack layout is elsewhere
  typedef Rep& stack;
  stack create(); // make a new stack
  void destroy(stack s); // delete s
  void push(stack s, char c); // push c onto s
  char pop(stack s); // pop s
}

这是在"C++之旅"单元中,甚至在函数、循环和基本数据类型等基本材料之前。。。我不知道我是否/如何理解这个代码。

不管怎样,有人能解释一下吗?它应该是解释如何"定义一个具有接口的堆栈管理器"的一部分

首先,我特别不知道"typedef Rep& stack"是什么意思。

简而言之,stack是引用类型Rep的typedef。这意味着,无论何时使用stack,都表示类型"referencetoRep"。

在我看来,这是一个奇怪的C++课程材料。从接口的外观来看,我们可以假设实现将类似于

/* in darkcorner.cpp: */

stack create() { // make a new stack
  stack s = *new Rep;
  return s;
}
void destroy(stack s) { // delete s
  delete &s;
}
void push(stack s, char c) { // push c onto s
  s.push(c);
}
char pop(stack s) { // pop s
  return s.pop();
}

现在,如果你做了以下操作,你就违反了大多数C++程序员最不意外的原则。

stack p = create();
stack p2 = p;

"最小惊喜原则"规定,这将复制堆栈。但实际上,stack代表类型Rep&,它是"对Rep的引用"。这意味着第二行创建了p的别名(参考p所指的内容(。它不复制,只是创建另一个引用。

我建议你:远离这样的代码。如果要隐藏Rep的实现或布局,请实现Pimpl习惯用法。

typedef Rep& stack表示stack将是Rep&的同义词。所以不是

Rep &r;

你可以写

stack r;

更新:Rep &r表示r是对类型为Rep的对象的引用。

例如:

Rep rep; // object of type (class) Rep
Rep &ref = rep; // reference to rep

顺便说一句。我不喜欢你发布的代码。

  1. typedef仅仅把某个东西作为参考并不是一个好主意;应该清楚地看到某个东西是指针或引用,因为它的行为方式与它看起来的方式大不相同。

  2. push()pop()应该是Rep类的方法(或更好的Stack(,或者它是比C++更多的C代码:(

  3. 内存管理;您必须注意,对于从create()获得的每个堆栈,都会调用destroy()。通常使用智能指针来确保正确的内存管理。

您在一个名为"Stack"的命名空间中,这样可以防止您声明的所有符号都是全局的,并可能与其他符号发生冲突。

struct Rep是一个正向声明,它表示在其他地方正确定义了一种名为Rep的结构类型,即使您不知道它在这里有什么布局,也会引用它。

CCD_ 24使"stack"成为"Rep&"的同义词,正如梅萨已经回答的那样。所以无论你在哪里写"stack",它都和写"Rep&"一样。Rep &表示对"Rep"类型结构的引用。即使不知道Rep的完整定义,引用的大小也是已知的,因此转发声明不是问题。

剩下的四行声明的函数大概将执行名称建议的操作,如注释中所述。

这是一种向C程序员展示C++对象如何形成的方法;namespace Stack { struct Rep; }将为您提供一个类似于执行class Stack { struct Rep;}Stack::Rep项目/对象。如果您不熟悉C和名称空间,那么在本书的开头,这似乎是一个奇怪的例子。

无论如何,这是我最好的猜测,因为当我在使用C一段时间后第一次看到它时,我意识到"哦,对象就是这样产生的。它们是名称空间,在编译器中添加了一些额外的乐趣!">

typedef Rep& stack表示在命名空间Stack中,如果使用stack,则表示其类型为Rep&。这就像给一个单词指定一个类型。