静态函数与类的静态指针有什么区别
说实话,我想问一些问题,但只会用到一个问题。静态函数与类的静态指针有什么区别
通过我所见,静态函数可以在外部访问,而不需要创建类对象,所以我假设这些函数来自在程序初始化时创建的默认副本。当一个类通常具有单个用法的私有构造函数并且使用已知方法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
}
您的假设是有缺陷的。静态函数不使用在程序初始化时创建的一些私有默认副本。他们根本不使用任何副本。静态函数实际上只是一个名称空间函数,可以访问类的静态成员以及任何嵌套类型。当你说没有this
指针时,你是正确的,因为没有任何类的实例。
实际上,您可以将您的静态方法实现为全局函数,而不会改变任何行为。只要将它从类中拉出来,将它标记为类的朋友,然后使用类名称空间限定符(例如store::
)限定对静态成员/嵌套类型的任何访问。
至于问题有关GetInstance()
,因为它使用一个静态变量,它总是返回相同的指针。静态变量基本上是全局变量,只能在本地范围内可见。所以对同一个静态变量的访问总是具有相同的值。
这被称为单例模式。
你已经偶然发现了单身模式。程序允许类store
的单个实例,并且可以通过GetInstance()
方法访问。对象static store obj;
仅初始化一次,并且每次调用GetInstance()
时都会返回一个指向它的指针。
为什么静态函数没有这个指针,因为没有创建副本?
因为它们没有与类的实例关联。
事情是你可以多次调用GetInstance,但指针指向的地址总是相同的,为什么会发生这种情况?
已经解释过,它是同一个对象。
第二,它和直接静态函数有什么不同?
有没有这样的事情,直接静态功能。
静态函数没有this
指针,因为它们无法访问实例变量。这就是为什么你首先声明它们是静态的原因(在OO文献中,C++的静态函数通常被称为类函数)。
相同的指针从GetInstance
返回的原因是,在方法内部变量存储在静态存储指针,
static store obj;
这意味着该方法的所有调用将得到相同的值。
您在调用实例函数时发生复制也是错误的。指针this
指向对象本身,因此您对storage
所做的更改将在实际对象上执行。
创建任何类型的静态,成员或免费函数。作为该计划的一部分,它们都始终存在。它们不会随着对象的创建而出现。这似乎是你最大的误解。
'GetInstance'只用于创建一个对象。一个实现它的类通常是一个单例。 – chris