0

嗨,我正在从 C 切换到 C++。在阅读http://www.gotw.ca/publications/xc++.htm时,我看到了这个代码块。

const int i = 1;
const int j = 2;
struct x
{
   int x;
};
namespace y
{
   int i[i];
   int j = j;
   x x;
   int y::y = x.x;
};

我对此特别感到困惑namespace y。请解释一下这段代码的行为和命名空间的使用。此外,我在某处读到了对命名空间的不当使用导致违反inheritance. 请给我一些出色地使用命名空间的例子。

4

3 回答 3

1

这个例子使用了一些非常模糊的代码来说明关于名称范围的观点。从 C++11 §3.3.6 [basic.scope.namespace] p1:

...命名空间成员名称具有命名空间范围。它的潜在范围包括从名称的声明点(3.3.2)开始的命名空间......

声明点在 §3.3.2 [basic.scope.pdecl] p1 中定义:

名称的声明点紧跟在它的完整声明符(第 8 条)之后和它的初始化器(如果有的话)之前,除非下面提到。

因此,可以在内部范围i命名的东西的初始化程序中使用外部范围的名称。i有问题的代码:

const int i = 1;
const int j = 2;
struct x
{
   int x;
};

namespace y
{
   int i[i];
   int j = j;
   x x;
   int y::y = x.x;
}

声明:

  • y::i作为一个 1 的数组int,将被隐式置零(因为所有静态存储持续时间对象如果没有显式初始化器,则它们都被初始化为零),
  • y::j作为一个int初始值为 2,
  • y::x作为::x将被隐式归零的类型的结构,并且
  • y::y是无效名称。如果它是简单y的 ,它将一个int初始值为 0 的,因为它的初始化程序y::x.x是隐式零初始化的。

这是 Coliru 的一个演示(已y::y更改为y)。

注意:永远不要写这样的代码。唯一一次使用这个名称特性甚至可以接受的是类构造函数中的成员初始值设定项。如果你在其他地方这样做,我会找到你的。我会让你付钱。

于 2013-07-30T05:57:32.533 回答
0

我认为你的代码有问题。int y::y = xx; 部分是错误的,因为在此之前没有 y,因此该声明需要一些更正。我正在尝试提供一些有关命名空间及其用法的基本信息,希望对您有所帮助。命名空间的主要目的是对功能进行逻辑分组,而不需要长名称和通过“使用”方便使用的选项。您还可以在不同的命名空间上使用相同的名称

namespace Color
{
    class Add {};
    class Multiply {};
};

namespace Dimension
{
    class Add {};
    class Multiply {};
};

因此,您可以在两个命名空间下使用相同的类名 Add、Multiply,您必须记住的一件事是仅在需要时使用命名空间,否则您会在不知情的情况下向全局命名空间“std”发送垃圾邮件,这不是常规的。

对于使用带有继承的命名空间,您可以在堆栈溢出中搜索文章,您肯定会得到一些。例如:在 C++ 中访问父命名空间

于 2013-07-30T05:49:01.973 回答
0
int i[i];  //line 1

它创建一个大小为 1 的 int 数组,因为索引 i 是一个初始化为 1 的常量

int j = j; //line 2

它在命名空间 y 中声明变量 j 并将其初始化为 2(常量 j 的值)

x x;   //line 3

它创建了一个 struct x 类型的结构变量 x (注意:结构变量 x 与结构 x 内部的 int x 不同,int x 是结构 x 的成员

int y::y = x.x;  //line 4

这在语法上是错误的,不需要用命名空间('y')来限定 int y,因为它已经存在于命名空间 y 中,所以语句应该是

int y = x.x 

其中 xx 表示访问第 3 行中创建的结构变量 x 的数据成员 (int x)


命名空间示例看看这个例子,它可以帮助你清楚地理解命名空间。有关更多示例,请参阅链接 [链接] http://www.cplusplus.com/doc/tutorial/namespaces/

   #include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using namespace first;
  cout << x << endl;
  cout << y << endl;
  cout << second::x << endl;
  cout << second::y << endl;
  return 0;
}

//输出 5
10
3.1416
2.7183

          ......Hope it helps you....:)
于 2013-07-30T06:20:09.607 回答