簡體   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