静态函数与指向类的静态指针之间有什么区别

时间:2012-09-11 21:05:16

标签: c++ class object pointers static

老实说,我想提出几个问题,但只会用一个问题来做。

通过我所见,可以从外部访问静态函数,而无需创建类对象,因此我假设这些函数来自在程序初始化时创建的默认副本。当一个类通常具有单一用法的私有构造函数并且使用已知方法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 个答案:

答案 0 :(得分:3)

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

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


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

这称为单身模式。

答案 1 :(得分:3)

不会创建任何类型的函数,静态,成员或空闲。作为该计划的一部分,它们始终存在。它们不会随着对象的创建而存在。这似乎是你最大的误解。

答案 2 :(得分:1)

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

  

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

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

  

问题是你可以多次调用GetInstance但是指针指向的地址总是一样的,为什么会这样?

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

  

第二,它与直接静态函数的区别是什么?

没有直接静态功能。

答案 3 :(得分:1)

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

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

static store obj;

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

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