0

老实说,我想问几个问题,但只会用一个问题来回答。

根据我所见,静态函数可以在不需要创建类对象的情况下从外部访问,因此我假设这些函数来自程序初始化时创建的默认副本。当一个类通常具有单独使用的私有构造函数并且使用已知方法GetInstance时,返回指针将指向的静态变量的地址。问题是您可以GetInstance多次调用但指针指向的地址始终相同,为什么会发生这种情况,其次,它与直接静态函数有什么区别?我知道GetInstance我可以访问storage向量,因为创建了“COPY”(请参阅​​上面的问题)并且该函数StoreB有一个this指针,这也让我想到了一个问题,为什么静态函数没有this指针,因为没有创建副本?

class store
{
private:
    store(){};
    ~store(){};

    std::vector<int>storage;
public:

    static void Store( int a );
    void StoreB( int a );

    static store* GetInstance()
    {
        static store obj;
        return& obj;
    }
};

void store::StoreB( int a )
{
    storage.push_back( a );
}

void store::Store( int a )
{
    //storage.push_back( a ); //can't

}

int _tmain(int argc, _TCHAR* argv[])
{
    store::Store( 2 );
    store::GetInstance()->Store( 3  );

    store *a = store::GetInstance();
    store *b = store::GetInstance(); 

    cout << a << endl //points to the same address
        << b << endl; //points to the same address


}
4

4 回答 4

3

不创建任何类型的函数,静态的、成员的或自由的。作为程序的一部分,它们在任何时候都存在。它们不会随着对象的创建而突然出现。这似乎是你最大的误解。

于 2012-09-11T21:14:05.950 回答
3

你的假设是有缺陷的。静态函数不使用在程序初始化时创建的一些私有默认副本。他们根本不使用任何副本。静态函数实际上只是一个可以访问类的静态成员和任何嵌套类型的命名空间函数。当你说没有this指针时你是正确的,因为没有任何类的实例。

事实上,你可以将你的静态方法实现为一个全局函数,而不会改变任何行为。只需将其从类中拉出,将其标记为类的朋友,然后使用类命名空间限定符(例如store::)限定对静态成员/嵌套类型的任何访问。


至于关于 的问题GetInstance(),总是返回相同的指针,因为它使用的是静态变量。静态变量基本上是仅在本地范围内可见的全局变量。因此,对同一静态变量的任何访问始终具有相同的值。

这称为单例模式。

于 2012-09-11T21:08:55.767 回答
1

您偶然发现了单例模式。该程序允许该类的单个实例store,并且可以通过该GetInstance()方法访问它。该对象static store obj;只初始化一次,每次调用时都会返回一个指向它的指针GetInstance()

为什么静态函数没有 this 指针,因为没有创建副本?

因为它们与类的实例无关。

问题是您可以多次调用 GetInstance 但指针指向的地址始终相同,为什么会发生这种情况?

已经解释过了,它是同一个对象。

其次,它和直接静态函数有什么区别?

没有直接静态函数之类的东西。

于 2012-09-11T21:09:32.660 回答
1

静态函数没有this指针,因为它们无法访问实例变量。这就是您首先将它们声明为静态的原因(在 OO 文献中,C++ 的静态函数通常称为类函数)。

返回相同指针的原因是GetInstance方法内部的变量将指针存储在静态存储中,

static store obj;

这意味着该方法的所有调用都将获得相同的值。

调用实例函数时发生的复制也是错误的。指针this指向对象本身,因此您所做的更改将storage在实际对象上执行。

于 2012-09-11T21:10:52.743 回答