3

我试图理解Named Constructor Idiom我的例子中的

点.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);}

主文件

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

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

它不编译如果Point::rectangular不是static,我不明白为什么......

4

1 回答 1

4

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

这意味着您可以在没有该类的实例的情况下调用静态函数。而不是需要类似的东西

Point p1;
p1.foo();

你只需这样做:

Point::foo();

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

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

于 2013-02-25T21:59:31.867 回答