2013-02-25 80 views
3

我想不懂的例子中的Named Constructor Idiom我有爲什麼我必須把這個功能靜態

Point.h

class Point 
{ 
    public: 
     static Point rectangular(float x, float y); 
    private: 
     Point(float x, float y); 
     float x_, y_; 
}; 
inline Point::Point(float x, float y) : x_(x), y_(y) {} 
inline Point Point::rectangular(float x, float y) {return Point(x,y);} 

的main.cpp

#include <iostream> 
#include "include\Point.h" 
using namespace std; 

int main() 
{ 
    Point p1 = Point::rectangular(2,3.1); 
    return 0; 
} 

它確實不編譯如果Point::rectangular不是static,我不明白爲什麼...

+10

你知道靜態關鍵字在這種情況下做了什麼嗎? – 2013-02-25 21:50:52

+0

不,我恐怕...對我來說,靜態意味着函數不是在對象上調用,而是屬於整個類 – statquant 2013-02-25 21:51:43

+1

對。現在想想如果它不是靜態的,你會如何使用它來創建一個新對象?你需要有一個對象,所以你可以調用成員函數,但是如果你已經有一個對象,你不需要構造另一個對象。 – 2013-02-25 21:57:07

回答

4

在這種情況下,函數前面的關鍵字static意味着此函數不屬於該類的任何特定的實例。普通類方法有一個隱含的this參數,它允許您訪問該特定對象的成員。但是,static成員函數沒有隱含的this參數。實質上,靜態函數與自由函數相同,只是它可以訪問聲明的類中的受保護和私有成員。

這意味着您可以調用靜態函數而不需要該類的實例。而不是需要像

Point p1; 
p1.foo(); 

你只需做到這一點:

Point::foo(); 

如果您嘗試調用這樣的非靜態函數,編譯器會抱怨,因爲非靜態函數需要一定的參考價值分配給隱式this參數,並且Point::foo()不提供這樣的值。

現在你想要rectangular(int, int)爲靜態的原因是因爲它用於從頭開始構造一個新的對象Point。您並不需要現有的Point對象來構造新點,因此聲明函數static是有意義的。

相關問題