奇怪的代码......有人可以解释我这个

时间:2013-07-30 05:11:27

标签: c++ inheritance namespaces

您好我正在从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的基础知识。请给我一些使用命名空间的例子。

3 个答案:

答案 0 :(得分: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::jint,初始值为2,
  • y::x作为::x类型的结构,将隐式归零,
  • y::y是无效的名称。如果它只是y,则 int,初始值为0,因为其初始化程序y::x.x隐式为零初始化。

Here's a demo (with y::y changed to y) at Coliru.

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

答案 1 :(得分:0)

我认为您的代码存在一些问题。 int y :: y = x.x;部分是错误的,因为之前没有y,所以这个陈述需要一些修正。我试图给出一些关于命名空间及其用法的基本信息,希望它有所帮助。 命名空间的主要目的是逻辑地对功能进行分组,而不需要长名称和通过“使用”方便使用的选项。您还可以在不同的命名空间上使用相同的名称

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

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

因此,您可以在两个名称空间下使用相同的类名称Add,Multiply,并且您必须记住的一件事是仅在需要时才使用名称空间,否则您将在不知不觉中垃圾邮件全局名称空间“std”,这不是传统的。

对于使用带继承的命名空间,您可以在流中搜索堆栈中的文章,但肯定会得到一些。例如:Accessing Parent Namespace in C++

答案 2 :(得分: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')来限定,因为它已经出现在名称空间y中,所以语句应该是

int y = x.x 

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


命名空间示例看一下这个例子,它可以帮助您清楚地理解命名空间。有关更多示例,请参阅链接[link] 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....:)