簡體   English   中英

:: 與 。 用於成員函數(C ++)

[英]:: 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_ab的大小(而不是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.

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