C ++中命名空间后的类名

时间:2013-06-04 13:11:38

标签: c++

C ++新手

有一个名称空间,就在它后面有几个类名

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

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

5 个答案:

答案 0 :(得分:9)

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

它被称为前向声明

对于:

非常有用
  • 避免标题包含中的循环(当A类具有B类成员,B类具有A类成员时)
  • 减少类之间的依赖关系(因为你可以有一个指向前向声明类的成员指针,但不能直接拥有成员,因为编译器在没有实现细节的情况下不知道类的大小是多少,但是知道指针的大小)。这主要用于Pimpl idiom

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

CursorBufferAllocator只是在其命名空间中进行前向声明(因此它们可以在指针/引用上下文中使用)。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

当你是新手时,你将主要看到使用namespace std;

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

希望这会有所帮助