基本的C++语法:为什么名称空间在变量名之前使用,而不是在类类型之前使用

ber*_*436 3 c++

我是C++的新手,并且通过flightgear源代码趟过.我知道你可以限制指针的类型,就像这样

CRectangle * prect;   //prect is a pointer that must point to an object of type CRectangle
Run Code Online (Sandbox Code Playgroud)

我也明白你可以引用命名空间中的变量,如下所示:

 cout << first::var << endl;   //prints value of var in namespace = first
 cout << second::var << endl;  //prints value of var in namespace = second
Run Code Online (Sandbox Code Playgroud)

话虽如此,我试图理解flightgear代码库中的这一行代码:

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;
Run Code Online (Sandbox Code Playgroud)

看起来它正在创建一个名为keyboardInput的指针,类型为FGKeyboardInput.但我对keyboardinput之前的命名空间声明做了什么感到困惑.是否将变量键盘输入声明为命名空间FGKeyboardInput的一部分?在链接的命名空间教程中,通过将变量包含在命名空间括号中,将变量声明为某个命名空间的一部分.以上代码是否像这样的东西?

namespace FGKeyboardInput
{
  FGKeyboardInput * keyboardInput = NULL;
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 8

在C++中,符号名称具有范围和可见性.如果在命名空间中定义数据类型,则符号名称仅在该命名空间中可见.为了能够在当前范围中使用该符号名称,您需要导入该符号名称.有很多方法可以做到这一点:

所以当你使用时:

cout << first::var << endl; 
Run Code Online (Sandbox Code Playgroud)

这意味着引用var位于命名空间中的内容first.请注意,如果它是静态成员,它还可能意味着引用var位于类\结构中的结构.

如上所述,

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;
Run Code Online (Sandbox Code Playgroud)

似乎是在命名keyboardInput的类\结构内部命名的静态数据成员指针的定义,FGKeyboardInput它是指向该类型的指针FGKeyboardInput.