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

时间:2013-09-14 15:08:48

标签: c++

我是C ++的新手,并且通过flightgear源代码涉猎。我知道您可以限制指针的type,如此

CRectangle * prect;   //prect is a pointer that must point to an object of type CRectangle

我也明白你可以引用namespace中的变量,如下所示:

 cout << first::var << endl;   //prints value of var in namespace = first
 cout << second::var << endl;  //prints value of var in namespace = second

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

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;

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

namespace FGKeyboardInput
{
  FGKeyboardInput * keyboardInput = NULL;
}

2 个答案:

答案 0 :(得分:8)

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

所以当你使用:

cout << first::var << endl; 

这意味着引用位于命名空间var中的first。请注意,它也可能意味着引用var,它位于类\ structure ,如果 它是静态成员。

如上所述,

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;

似乎是在名为keyboardInput的类\结构中定义名为FGKeyboardInput的静态数据成员指针,它是指向类型FGKeyboardInput的指针。

答案 1 :(得分:3)

  

我也明白你可以在命名空间中放一个变量,如:

这不是你在命名空间中放置变量的方式,而是引用到已经放在命名空间中的变量的方式。

  

好像它正在创建一个名为keyboardInput的指针,类型为FGKeyboardInput。

右。

  

但是我对于keyboardinput之前的命名空间声明做了什么感到困惑。是否将变量键盘输入声明为命名空间FGKeyboardInput?

的一部分

没有。这不是任何事情的声明::之前的名称是范围,可能是命名空间,但在这种情况下它不是。您已经确定FGKeyboardInput是一种类型,类型名称可以是范围。您正在查看的是静态数据成员的定义,其声明如下:

class FGKeyboardInput
{
public:
    static FGKeyboardInput* keyboardinput;
};

它定义了一个类FGKeyboardInput,并声明了类keyboardinput的静态数据成员。必须在程序中的某个位置定义静态数据成员,如下所示:

FGKeyboardInput * FGKeyboardInput::keyboardInput = NULL;

在这种情况下,FGKeyboardInput::部分引用在FGKeyboardInput类范围内声明的内容。您使用类似的语法来定义在类中声明的成员函数:

class Foo
{
public:
    int func();   // declare member function
};

int Foo::func()   // define member function
{
    // ...
}

要定义成员函数,您必须使用其所属类的名称对其进行限定,即Foo::func

  

上面的代码是不是像这样的东西?

不,没有这样的简写,要声明命名空间的成员你必须打开命名空间并在里面声明成员,你不能使用::运算符添加到范围,你只能参考已经在该范围内宣布的事情。