2015-11-05 52 views
0

一個非常基本的問題,但我一直在這個難題。爲什麼在std :: cout中使用「::」運算符而不是「。」運營商?

爲什麼我們究竟寫

int main(){ 
    std::cout << "HelloWorld!"; 
} 

而不是

int main(){ 
    std.cout("HelloWorld!"); 
} 

據我所知,::運算符用於在類編輯功能,但爲什麼會在這種情況下用來調用std類中的一個函數,而不是。運營商?

+6

'std'不是類。它是名字空間。 –

+0

'.'僅在左側有*值*的情況下使用。它意味着從該值的類中選擇一個成員。 '.'和'::'是C++語言的「allophones」 - 沒有任何情況他們都是正確的,並且會有不同的含義。但它有助於可讀性,因爲如果你看到'.',那麼你就知道你正在使用一個對象。 –

回答

4

::運算符是範圍解析運算符。前綴可以是一個名稱空間或一個類。

.運算符用於選擇對象的成員。前綴是結構,聯合體或類類型的表達式(並且通常是該類型的對象的名稱)。

std是一個命名空間,而不是一個類。即使它是一個類,std::cout仍然是正確的,如果cout是該類的靜態成員。 std.cout只有當std對象時纔是正確的,該對象具有名爲cout的成員類型。

C++ 可以已經被定義爲使用.對於所有這些情況,但使用的::爲範圍解析運營商和.爲成員選擇運算符可以使代碼更易於閱讀,因爲它是更加明確。 (還有其他兩種語言都使用.。)

+0

這樣做很有意義,謝謝! –

2

因爲std不是一個對象,但一個命名空間和scope resolution operator::用於指定的上下文或範圍的使用來解決的標識符,其中在C++中可以是一個類或一個命名空間。 .運算符是成員訪問運算符,用於訪問對象的成員而不是類或名稱空間範圍內的名稱。

所以std::cout意思是「名稱cout在命名空間std」,而例如是std::ios_base::binary在命名空間stdfoo.x在類ios_base的範圍定義的常數被命名爲名爲foo對象的x成員變量。

+1

那麼'''用於訪問命名空間中的成員'''用於訪問類中的成員? –

+1

這是不正確的。 '::'用於類和名稱空間。 –

+0

@ M.M一個類可以是範圍解析運算符上下文中的'名稱空間'。例如,一個嵌套的類定義存在於其封閉類的名稱空間中。 – mattnewport