文章转自:C语言和c++中的static总结
C语言中的static
- static修饰全局变量,改变了变量的链接属性,使得这个全局变量只能在本文件中访问。
- static修饰局部变量,使其生命周期变长,只在该作用域中使用,离开该作用域。该变量没有被销毁,还在内存中,即使再一次访问,还是上一次变量的值,直到程序运行结束才释放,被static修饰的局部变量放在静态区存储区
- static修饰函数,改变了函数的链接属性,只能在本文件中调用,不能被其他文件访问
注意:静态变量可以多次赋值,但是只能初始化一次
static int a = 10;
a = 20;
int c = b;
//请问c为多少? 10;
C++ 中的Static
人们希望能有一个或者几个数据是一个类所有的对象共有,比如学生属性,除了包含自身信息,成绩等,还希望拥有班上学生平均成绩,这个平均成绩就是每个对象(学生)拥有的,不单单只属于某个学生的属性。可以把平均成绩设置为全局变量,但不安全,且破坏类的分装性,所以引入静态成员的概念。static可以修饰变量和函数改变了变量的生命周期。
class stu
{
public:
static void shown(); //静态成员函数
....
private:static int num; //静态成员变量
...
};
//静态成员变量必须在类外定义
int stu::num = 0;
//静态成员函数可以在类外(或类内)定义
void stu:: shown()
{
....
}
int main()
{
//调用静态成员函数的三种方式
stu s1;
s1.shown(); //方式1
stu::shown() //方式2
//方式三,用对象指针或者对象引用,主要用于静态成员函数访问非静态成员,一般它不访问静态成员
return 0;
}
static修饰类成员变量
static修饰成员变量:变量在类内声明,在类外定义,定义时,不需要加static关键字;
class student
{
public:
student(int n, char *nm, double s); //构造函数
~student(); //析构函数
void shown_infom();
void shown_count_sum();
private:
int num;
char *name;
double score;
static int count; //静态成员变量
static double sum;
};
//类外初始化静态成员变量
int student::count = 0;
double student::sum = 0;
//类外初始化析构函数
student::student(int n, char *nm, double s)
{
name = new char[strlen(nm) + 1];
num = n;
strcpy(name,nm);
score = s;
count++; //静态成员变量不能在构造函数初始化列表中
sum += score;
}
//初始化构造函数
student::~student()
{ }
void student::shown_infom()
{
cout << num << " " << name << " " << score << endl;
}
void student::shown_count_sum()
{
cout << count << " " << sum << endl;
}
int main()
{
student st1(20160505, "bcr", 89.3);
st1.shown_infom();
st1.shown_count_sum();
student st2(20160506, "lzk", 79.4);
st2.shown_infom();
st2.shown_count_sum();
system("pause");
return 0;
}
特性(针对static修饰成员变量)
1.静态成员(包括变量和成员函数)为所有类对象所共享,不属于某个对象,是类属性。
2.静态成员变量必须在类外初始化,初始化时不添加static关键字,不能再构造函数初始化表中。
3.sizeof(对象)大小不包括静态成员。
特性(针对static修饰的成员函数)
- 静态成员函数没有隐藏的this指针,一般不能访问任何非静态成员(非静态可以访问静态),但普通成员有this指针。当调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。当调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。但是静态成员函数不属于对象的成员函数,与任何对象无关,因此静态成员函数没有this指针,
既然没有指向某一对象,就无法对一个对象里的非静态成员进行默认访问(即在引用数据成员时不指定对象名)
-
可以不用通过对象调用:
对象.静态成员,
类型::静态成员函数名字 -
因为没有this指针,所以不能用const修饰;