2012-09-11 56 views
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 


} 
+1

'GetInstance'只用于创建一个对象。一个实现它的类通常是一个单例。 – chris

回答

3

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

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


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

这被称为单例模式。

1

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

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

因为它们没有与类的实例关联。

事情是你可以多次调用GetInstance,但指针指向的地址总是相同的,为什么会发生这种情况?

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

第二,它和直接静态函数有什么不同?

有没有这样的事情,直接静态功能。

1

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

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

static store obj; 

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

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

3

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