老实说,我想提出几个问题,但只会用一个问题来做。
通过我所见,可以从外部访问静态函数,而无需创建类对象,因此我假设这些函数来自在程序初始化时创建的默认副本。当一个类通常具有单一用法的私有构造函数并且使用已知方法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
}
答案 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
所做的更改将在实际对象上执行。