繁体   English   中英

奇怪的代码...有人可以向我解释一下

[英]Strange code… Can someone explain me this

嗨,我正在从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 请给我一些出色使用命名空间的示例。

本示例使用一些令人费解的代码来说明有关名称范围的观点。 从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作为初始值2的int
  • y::x作为类型::x结构,将隐式置零,并且
  • y::y是无效的名称。 如果只是y ,则它将是一个初始值为0的int ,因为其初始化器y::xx被隐式初始化为零。

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

注意:请勿像这样写代码。 唯一使用这种名称甚至边界的功能是针对类构造函数中的成员初始化程序的。 如果您在其他任何地方这样做,我会找到您。 我会让你付款。

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

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

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

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

为了将命名空间与继承一起使用,您可以在整个流程中搜索堆栈中的文章,当然您会得到一些。 例如: 在C ++中访问父命名空间

int i[i];  //line 1

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

int j = j; //line 2

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

x x;   //line 3

它创建结构类型为x 的结构变量 x( 注意:结构变量x与结构x内部存在的int x不同,int x是结构x的成员

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

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

int y = x.x 

其中xx代表访问第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....:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM