[英]:: versus . for member functions (C++)
我知道,給定一個類,例如std :: array,它具有一個成員函數,例如size(),我們可以通過“。”調用該成員函數,也就是說,在以下代碼中,
array<int,5> myarray;
int s=myarray.size();
s是代表myarray大小的整數。 棘手的事情發生在名稱空間運算符“ ::”也可以調用成員函數時。 例如,我知道以下代碼行是有效的:
auto t=chrono::high_resolution_clock::now();
然后,采用我們最初用於數組的語法有什么問題?
chrono::high_resolution_clock myclock;
auto t=myclock.now();
now()
是static
成員函數。 這意味着函數本身沒有隱藏的this
指針。 相反,它就像一個常規函數-只是類的一部分,以避免名稱沖突。
(在您的示例中, high_resolution_clock
是一個類, chrono
是一個名稱空間。都使用::
表示“我想要{namespace,class}內部的東西)
簡單來說, ::
將名字和姓氏分開,而.
將組件與子組件分離。 (請注意,在許多語言中,例如C#,Java,D等),沒有這種區別)
在您的第一個示例中, myarray
是一個變量,其size()
方法引用該特定變量。
array<int,5> myarray_a, myarray_b;
int sa=myarray_a.size();
int sb=myarray_b.size();
將分別給出myarray_a
和b
的大小(而不是array<int,5>
,即使由於這種特殊情況,所有大小均為5)
在第二個示例中,now()是chrono::high_resolution_clock
類的static
方法。
是否具有chrono::high_resolution_clock
類型的變量(以及數量)無關緊要。 該函數不引用變量,但是對相同類型的所有變量都起作用(概念上now
只有一個,無論您問誰)。
因此,通過完全限定其名稱來調用now()
作為變量的一部分是相同的。
需要注意的是,該size()
的函數std::array
是奇怪 :的大小std::array
是編譯定義的時間,因此, size()
本來是靜態為好。 但是std::
設計器允許它們作為成員(盡管constexpr
,因此仍可在編譯時表達式中使用)以保留與std::array
或其他容器(必須是動態的並與變量關聯的容器)相同的行為,因為每個大小在執行期間可能會有所不同)
您在這里混淆了兩個概念:“ ::”用於名稱空間,也用於調用靜態方法。
您建議的語法沒有錯 。 有用。
但是,它將創建一個對象,而::
版本不會創建任何對象。 創建該對象似乎沒有多大意義,因為不必為了調用靜態函數而這樣做。 因此,僅調用靜態函數而不創建對象會更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.