2013-07-30 70 views
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的基本原理的地方。請給我一些使用命名空間出色的例子。

+2

這是否代碼甚至編譯? – leppie

+0

@leppie。我不知道。在書中,他們是這樣寫的,並將其標記爲一個工作示例... – someone

+0

簡化,'namespace y'表示「我括號內包含的所有內容都需要以'y ::'爲前綴,以便編譯器找到」這是一個避免命名衝突的方式,'x :: x'與'y :: x'不同,沒有命名空間都會被命名爲'x'。 –

回答

1

這個例子使用了一些可怕的混淆代碼來說明關於名稱範圍的觀點。 From 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類型的結構,這將是病理意義citly歸零,並且
  • y::y是無效的名稱。如果它簡單地是y,它的將是int初始值爲0,因爲它的初始化程序y::x.x隱含地被零初始化。

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

注意:永遠不要這樣寫代碼。使用這個名稱特性的唯一時間甚至可以接受的是在類構造器中的成員初始化器。如果你在其他地方做這個,我會找到你的。我會讓你付錢。

0

我認爲你的代碼存在一些問題。 int y :: y = x.x;部分是錯誤的,因爲在此之前沒有y,所以這個聲明需要一些更正。我正在嘗試給出一些關於命名空間及其用法的基本信息,希望它有所幫助。 命名空間的主要目的是在邏輯上將功能分組而不需要長名稱和通過「使用」方便使用的選項。您也可以使用相同的名稱在不同的命名空間

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

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

所以,你可以使用相同的類名添加,乘下的兩個命名空間,哪些是你要記住的一件事是使用命名空間,才需要否則當你將垃圾郵件的全局命名空間「std」在不知名的情況下是不常規的。

對於通過繼承來使用命名空間,您可以搜索堆棧上的文章,而且肯定會得到一些。例如:Accessing Parent Namespace in C++

+0

我將這個問題理解爲「爲什麼這個代碼使用名稱空間和用於什麼」而不是「什麼是名稱空間及其用途」 – nijansen

0
int i[i]; //line 1 

它創建尺寸1的int數組,作爲索引i是常數初始化爲1

int j = j; //line 2 

它聲明和一個initilizes變量j到2(恆定j的值)命名空間ÿ

x x; //line 3 

它創建一個結構變量x型結構x(爲注:結構變量x是從INT X存在於結構X的內部不同,INT x是STRUC的成員TURE X

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

這在語法上是錯誤的,沒有必要的資格INT y隨命名空間(「Y」),因爲它是在namespaaceŸ已經存在,所以語句應該

int y = x.x 

其中xx表示訪問數據成員在該行創建的結構變量x的(INT X)3


命名空間例如對此示例一看,它可以幫助你理解命名空間清晰。參閱的鏈接更多的例子[鏈接] 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; 
} 

//輸出 3.1416
2.7183

  ......Hope it helps you....:) 
相關問題