一、简述:
C++中static关键字可以用来修饰类成员变量以及类成员函数。虽然修饰类成员变量和类成员函数的功能不一样。但是都有一个共同点,被static修饰的变量或者是函数都是属于类所有,并不属于某个对象。
二、static修饰类成员变量:
1、被static修饰的类成员变量与其它普通变量无论是在初始化、存储位置、使用、所属等都有很大的差异。
⑴被static修饰的类成员变量存储在.data段上;而普通的类成员变量存储在栈或堆上(具体视对象定义的情况而定)。
⑵既然静态成员变量是属于类,而不属于具体的某个对象,所以在初始化上并不能像普通的成员变量能够在构造函数、拷贝构造函数、构造函数的初始化列表上对其进行初始化,可以在类内初始化和类外初始化如:
class demo{
private:
static int member; //仅是声明。
static int count = 20; //类内初始化。
};
int demo::member = 100; //类外初始化,但是需要在内类声明
⑶静态变量使用如下:
#include <iostream>
using namespace std;
class demo
{
public:
demo(int n):n_member(10){
}
int get_member();
static int s_member = 10;
int n_member;
};
int main()
{
demo a(10);
cout << a.n_member << endl;
cout << a.s_member << endl; //该使用方式是错的,静态成员并不属于具体的对象。
cout << demo::s_member << endl; //该使用方法是正确的。
return 0;
}
三、static修饰的方法:
⑴static修饰的方法,也是属于类;而不是属于具体某个对象。static修饰的方法,只能访问由static修饰的成员变量、以及调用static修饰的方法。不能访问普通的类成员变量,以及类方法。例如:
class demo{
public:
int get_member();
static int get();
static void set(int s);
private:
static int s_member;
int n_member;
};
int demo::s_member = 10;
int demo::get_member()
{
return n_member;
}
void demo::set(int s){
s_member = 10;
}
int demo::get()
{
set(20);
return get_member(); //该用法是错误
}
针对为什么static修饰的成员变量以及函数不能和普通的变量和函数混合使用,原因有两点:
①:他们的属主不同,静态变量以及静态方法属于类。而普通变量以及方法是属于对象。所以不能混合使用。
②:他们存储的空间不同导致(上述这两种方法是个人联想的。)
四、单实例化模型:
class demo{
public:
static demo* demo_init()
{
if(s1 != NULL){
return NULL;
}
s1 = new demo;
return s1;
}
private:
/*需要在私有属性下,将构造函数、拷贝构造函数重新实现一次。防止实例化的时候调用类的公有的构造函数以及拷贝构造函数。*/
demo(){
}
demo(demo& another)
{
}
demo & operator =(const demo& another){
}
demo *s1;
};
int main()
{
demo s = demo::demo_init();
return 0;
}
/*使用该方法,可以保证整个工程里,仅有一个demo类的实例。*/