2014-06-06 72 views
0

我知道,給定一個類,說,具有成員函數,說,尺寸(),我們可以通過「。」調用該成員函數,即,在以下代碼中,::與。爲成員函數(C++)

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(); 
+0

你必須閱讀'靜態成員函數'。 –

+0

'now()'是一個靜態成員函數。 – cbel

+0

http://stackoverflow.com/questions/4723143/c-static-member-functions – 101010

回答

6

now()是一個static成員函數。這意味着該函數本身沒有隱藏的指針this。相反,它就像普通函數 - 只是類的一部分,以避免名稱衝突。

(該high_resolution_clock是一類,chrono是一個命名空間,在你的榜樣。兩者都使用::,表示「我想要的東西從裏面{空間,類})

+0

也許這引出了另一個問題:在'std :: array '的特殊情況下,爲什麼'size()'*不是靜態成員函數? –

+1

因爲STL的設計者希望它與'std :: vector'正交。 –

0

你是混合了2個概念在這裏: 「::」用於命名空間,也爲呼叫靜態方法。

+0

C++在這裏混合了兩個概念:-p – Will

0

沒有什麼的語法

但是它創建了一個對象,而::版本沒有創建任何對象。創建該對象似乎沒有多少意義,因爲它不需要這樣做以便調用靜態函數,因此只需調用靜態函數就簡單多了創建對象。

+0

這太好了。謝謝!我其實更喜歡這種冗餘,因爲我現在處於學習階段。 – user3713167

+0

「它創建一個對象」?真?你有這方面的來源嗎?它會怎麼做,哪個ctor? – MSalters

+0

@MSalters如果'X'是一個類,那麼'X x;'(在函數或命名空間範圍內)會創建一個'X'類型的對象'x'。你真的需要一個標準的參考嗎? –

1

簡而言之,::將名稱和姓氏區分開來,而.將組件從子組件中分離出來。 (請注意,在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>,即使-due這個特定區分所有尺寸將是5)

在第二示例中,現在()是一個static該方法chrono::high_resolution_clock

如果你有或沒有變量(和多少)chrono::high_resolution_clock類型沒有關係。該函數並不涉及變量,但對於相同類型的所有變量的作用是相同的(概念上只有一個now,不管你要求誰)。

因此,通過調用now()作爲變量的一部分,通過完全限定其名稱是相同的。

注,std::arraysize()功能奇怪:中std::array大小編譯定義的時間,因此size()本來是靜態的爲好。但是std::設計者讓他們作爲成員(儘管constexpr,在編譯時表達式中仍然可用)保持與std::array或其他容器(其必須是動態的並且與變量相關聯)中相同的行爲,因爲每個大小在執行)