[英]:: (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.