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、理由がわかりません...

4

1 に答える 1

4

このコンテキストでは、関数の前のキーワードは、この関数がクラスの特定のインスタンスstaticに属していないことを意味します。通常のクラス メソッドには、その特定のオブジェクトのメンバーにアクセスできる暗黙的なパラメーターがあります。ただし、メンバー関数には暗黙のパラメーターがありません。基本的に、静的関数は、それが宣言されているクラスの保護されたプライベート メンバーにアクセスできることを除いて、自由関数と同じです。thisstaticthis

これは、そのクラスのインスタンスなしで静的関数を呼び出すことができることを意味します。のようなものを必要とする代わりに

Point p1;
p1.foo();

これを行うだけです:

Point::foo();

このように非静的関数を呼び出そうとすると、非静的関数は暗黙のthisパラメーターに割り当てる値が必要であり、Point::foo()そのような値を提供しないため、コンパイラーはエラーを出します。

rectangular(int, int)静的にしたい理由は、新しいPointオブジェクトを最初から構築するために使用されるためです。新しいポイントを構築するために既存のオブジェクトは必要ないのでPoint、関数を宣言するのは理にかなっていますstatic

于 2013-02-25T21:59:31.867 に答える