簡體   English   中英

::(作用域分辨率運算符)在C ++中有多種用途?

[英]:: (scope resolution operator) is used for multiple purposes in C++?

我正在學習C ++,並且想確認一些知識。 我已經看到std::cin具有::運算符,這意味着iostream.h文件必須在命名空間std中具有與cin相關的代碼。 而如果您包含myclass.h並且在這樣的命名空間中沒有類,

//myclass.h
class x { void func(){}};

然后,您無需執行此myclass:x.func(); 相反,我只能執行x.func(); 正確因為它不在名稱空間內。

其次, ::可以用於在類外部定義類函數,例如在其cpp文件中。 正確?

現在,我的另一個問題是這兩個功能是分開的還是一個? 他們對我來說看起來有所不同嗎?

::(作用域分辨率運算符)在C ++中有多種用途?

這實際上只是一個目的-幫助查找標識符所在的名稱空間和/或類/結構/聯合作用域。

編譯器知道首先要在最緊密的范圍內查看,然后再回到全局范圍,但是它還會考慮您正在“使用”的任何名稱空間和標識符(例如, using namespace xxx;using ns1::identifier; )。

然后,您無需執行此myclass:x.func();。 相反,我只能執行x.func();

它與磁盤上的文件無關。

其次,::可以用於在類外部定義類函數,例如在其cpp文件中。 正確?

是。 當您在類的外部定義成員函數時,請使用類名,因此在當前范圍內,它不被視為不同的非成員函數。

現在,我的另一個問題是這兩個功能是分開的還是一個? 他們對我來說看起來有所不同嗎?

只是上面的定義成員功能場景中的一個。

我已經看到std :: cin具有::運算符,這意味着iostream.h文件必須在命名空間std中包含與cin相關的代碼。

我意識到這不是問題,但您說的是iostream.h ,我想指出的是您不應該使用iostream.h因為它已被棄用,而應使用iostream

然后,您無需執行此myclass:x.func();。 相反,我只能做這個x.func();。 正確因為它不在名稱空間內。

這是對的。 如果所有代碼都在名稱空間而不是類中,則可以執行相同的操作。

其次,::可以用於在類外部定義類函數,例如在其cpp文件中。 正確?

只要在類范圍內已聲明但未定義它們就正確,這是允許的,並且通常出於可讀性考慮而更可取。

現在,我的另一個問題是這兩個功能是分開的還是一個? 他們對我來說看起來有所不同嗎?

如果兩者都已經在類范圍內,則void x::func(){}void func(){}產生相同的結果xa; a.func()例如,可以使用xa; a.func()來調用兩者)。

編輯:響應評論,您可以使用與定義類基本相同的方式定義名稱空間,如下所示:

namespace funcs
{
    void innerfunc(){}
    void outerfunc();
    void funcs::scopedfunc(){}
}
funcs::outerfunc();

正如您可以從std推斷出的那樣,這些被稱為自由函數,而不是像非靜態類函數那樣從對象中調用。

int main()
{
    funcs::innerfunc();
    using namespace funcs;
    outerfunc();
}

然后,您無需執行此myclass:x.func();。 相反,我只能做這個x.func();。

請注意,這些都不會編譯。 您不能將點運算符與類一起使用; 您只能將其與對象一起使用。 具體來說, myObject.func(); MyClass::func() { }用途完全不同。 第一個調用名為myObject的對象的成員函數func() 后者用於定義函數func() ,該函數屬於MyClass的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM