2013-03-26 62 views
13

我正在學習C++,我永遠無法知道何時需要使用::。我知道我需要在coutcin之前使用std::。這是否意味着iostream文件裏面創建它做了一個命名空間稱爲std,把功能cincout到名爲std命名空間中的開發者?當我由於某種原因創建與main()不在同一文件中的新課程時,我必須添加::在C++中使用::

例如,如果我創建了一個名爲Aclass,爲什麼我需要將A::放在我創建的函數的前面,即使我沒有將它放入namesace中?例如void A::printStuff(){}。如果我在main中創建了一個函數,爲什麼我不必把main::printStuf{}

我知道我的問題可能是混亂的,但可能有人幫助我嗎?

+2

罰款的問題,但有點過於寬泛(IMO)。這就是所謂的範圍解析運算符,並且用於進一步學習的搜索術語是* scope *。所有這些名字(''cout','A'的成員函數)在*作用域*中定義,並且必須使用'::'來解析作用域(即告訴編譯器在哪裏看)。 – GManNickG 2013-03-26 23:56:55

+0

'::'的前綴可以是名稱空間或類。由於'main'既不是(這是一個函數),'main :: printStuff'也是不正確的。 – 2013-03-26 23:57:43

+0

::也提供了所有權的概念,當一個定義是類或命名空間的一部分時,你應該使用::來訪問它......不完全是這樣,但是這給了你一種感覺。 – 2013-03-26 23:59:25

回答

16

你是非常正確的約coutcin。它們是在std命名空間中定義的對象(不是函數)。以下是作爲由C++標準中定義它們的聲明:

部首<iostream>概要

#include <ios> 
#include <streambuf> 
#include <istream> 
#include <ostream> 

namespace std { 
    extern istream cin; 
    extern ostream cout; 
    extern ostream cerr; 
    extern ostream clog; 

    extern wistream wcin; 
    extern wostream wcout; 
    extern wostream wcerr; 
    extern wostream wclog; 
} 

::稱爲範圍解析運算符。名稱coutcinstd中定義,因此我們必須使用std::來限定其名稱。

類的行爲有點像在類內聲明的名稱命名空間屬於類。例如:

class foo 
{ 
    public: 
    foo(); 
    void bar(); 
}; 

foo命名的構造是一個構件名爲foo類的。它們具有相同的名稱,因爲它的構造函數。功能bar也是foo的成員。

,因爲他們是foo成員,從類的外部引用它們的時候,我們有資格自己的名字。畢竟,他們屬於那個階級。所以,如果你要定義類的外部構造和bar,你需要做的是像這樣:

foo::foo() 
{ 
    // Implement the constructor 
} 

void foo::bar() 
{ 
    // Implement bar 
} 

這是因爲他們被定義類。如果您沒有對名稱進行foo::限定,您將在全球範圍內定義一些新功能,而不是作爲foo的成員。例如,這是完全不同的bar

void bar() 
{ 
    // Implement different bar 
} 

它允許具有相同的名稱作爲foo類的功能,因爲它是在不同的範圍。此bar處於全局範圍內,而其他bar屬於foo類。

+0

謝謝!最佳答案! – foobar5512 2013-03-27 00:25:27

6

::被稱爲範圍解析操作符。 可以使用這樣的:

::標識
類名::標識
命名空間::標識

你可以閱讀在這裏
http://msdn.microsoft.com/en-us/library/b451xz31(v=vs.80).aspx

+0

將它們鏈接起來沒有錯:'myNamespace :: myClass :: myMember'或':: std :: cout'。 – chris 2013-03-27 00:00:55

+2

+1來對付無法解釋的downvote – 2013-03-27 00:58:34

7

::用於取消引用範圍。

const int x = 5; 

namespace foo { 
    const int x = 0; 
} 

int bar() { 
    int x = 1; 
    return x; 
} 

struct Meh { 
    static const int x = 2; 
} 

int main() { 
    std::cout << x; // => 5 
    { 
    int x = 4; 
    std::cout << x; // => 4 
    std::cout << ::x; // => 5, this one looks for x outside the current scope 
    } 
    std::cout << Meh::x; // => 2, use the definition of x inside the scope of Meh 
    std::cout << foo::x; // => 0, use the definition of x inside foo 
    std::cout << bar(); // => 1, use the definition of x inside bar (returned by bar) 
} 

無關: cout和CIN不是函數,但流對象的實例。

編輯 固定爲Keine慾望建議

+0

這個答案很清楚。 +1 – frankliuao 2017-06-27 16:51:50

+1

不應該是'meh'中的'static const int x = 2;'? – 2017-08-24 18:12:16