为什么我必须把这个功能静态
问题描述:
我想不懂的例子中的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
,我不明白为什么...
答
在这种情况下,函数前面的关键字static
意味着此函数不属于该类的任何特定的实例。普通类方法有一个隐含的this
参数,它允许您访问该特定对象的成员。但是,static
成员函数没有隐含的this
参数。实质上,静态函数与*函数相同,只是它可以访问声明的类中的受保护和私有成员。
这意味着您可以调用静态函数而不需要该类的实例。而不是需要像
Point p1;
p1.foo();
你只需做到这一点:
Point::foo();
如果您尝试调用这样的非静态函数,编译器会抱怨,因为非静态函数需要一定的参考价值分配给隐式this
参数,并且Point::foo()
不提供这样的值。
现在你想要rectangular(int, int)
为静态的原因是因为它用于从头开始构造一个新的对象Point
。您并不需要现有的Point
对象来构造新点,因此声明函数static
是有意义的。
你知道静态关键字在这种情况下做了什么吗? – 2013-02-25 21:50:52
不,我恐怕...对我来说,静态意味着函数不是在对象上调用,而是属于整个类 – statquant 2013-02-25 21:51:43
对。现在想想如果它不是静态的,你会如何使用它来创建一个新对象?你需要有一个对象,所以你可以调用成员函数,但是如果你已经有一个对象,你不需要构造另一个对象。 – 2013-02-25 21:57:07