3

C++ 新手

有一个命名空间,即紧随其后的是几个类名

namespace abc {
 class Cursor;
 class BufferAllocator;
....
....
}

上面的 Cursor 和 BufferAllocator 的类声明在这里做了什么?

4

5 回答 5

9

它只是表示命名空间中的“这些类存在” abc,而没有提供有关其实现的任何信息。

这称为前向声明

它可用于:

  • 避免头包含中的循环(当 A 类有 B 类的成员,B 类有 A 类的成员时)
  • 减少类之间的依赖关系(因为你可以有一个指向前向声明类的成员指针,但不能直接拥有一个成员,因为编译器不知道类的大小没有其实现细节,但知道大小的指针)。这在Pimpl 惯用语中特别有用。

(这可能还有其他用途,但这些是最明显的想到的)。

于 2013-06-04T13:14:36.087 回答
5

这是一个前向声明。它告诉下面的代码“有一个名为 Cursor 的类。你不需要知道它里面有什么[因为我们只是将它用作代码中的指针或引用,直到它被定义]”。

于 2013-06-04T13:14:26.500 回答
3

Cursor并且BufferAllocator只是在它们的命名空间中被前向声明(因此它们可以在指针/引用上下文中使用)。

于 2013-06-04T13:14:03.777 回答
0

这是一个前向声明。当您只打算使用指向该类型的指针或引用时,它可用于通知编译器类型的存在。指针或引用的大小与它所引用的类型无关,因此在这种情况下编译器不需要查看类型的完整定义;它只需要知道类型首先存在。

这在通常声明类型的标头很大的情况下(想想包含大量声明或模板实例化的标头)会很有用,在这种情况下它可以减少编译时间(有时显着)。您可以只前向声明类型并跳过包含标题,因此您的编译器不需要处理它。

于 2013-06-04T13:17:23.693 回答
0

命名空间有助于避免在每个函数前面键入特定的类名。

由于您是新手,因此您大多会看到 using namespace std;

所以现在你可以直接使用 cout 如果你不使用这个语句那么你必须为每次使用 cout 编写 std::cout

希望这可以帮助

于 2013-06-04T13:52:07.140 回答