为什么我必须把这个功能静态

问题描述:

我想不懂的例子中的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

在这种情况下,函数前面的关键字static意味着此函数不属于该类的任何特定的实例。普通类方法有一个隐含的this参数,它允许您访问该特定对象的成员。但是,static成员函数没有隐含的this参数。实质上,静态函数与*函数相同,只是它可以访问声明的类中的受保护和私有成员。

这意味着您可以调用静态函数而不需要该类的实例。而不是需要像

Point p1; 
p1.foo(); 

你只需做到这一点:

Point::foo(); 

如果您尝试调用这样的非静态函数,编译器会抱怨,因为非静态函数需要一定的参考价值分配给隐式this参数,并且Point::foo()不提供这样的值。

现在你想要rectangular(int, int)为静态的原因是因为它用于从头开始构造一个新的对象Point。您并不需要现有的Point对象来构造新点,因此声明函数static是有意义的。