目录
Static修饰局部变量
Static修饰全局变量
Static修饰函数
Static修饰成员
Static修饰成员变量
Static修饰成员函数
Static修饰成员的特性:
静态成员变量和静态成员函数的使用案例:
案例1:求1 + 2 +3+...+n
案例2:单例模式
我们首先要知道,static修饰的对象,其存放位置和全局变量存放的位置一样,都在静态区(数据段)中。
Static修饰局部变量
Static修饰局部变量时,让一个局部变量变为静态的局部变量,生命周期变长,下一次执行时为上一次执行后留下来的值。即保留上次局部变量的值,不销毁。这个特性可以用于函数递归,让递归时保留一些我们想要的值。
Static修饰全局变量
修饰全局变量时,改变全局变量的作用域。比如:让一个可以在其他.c文件中用external引用的全局变量,只能在自己的.c/.cpp源文件内使用。出了自己的源文件外就不可使用了(将全局变量的外部链接属性改变成了内部链接属性)。
Static修饰函数
修饰自定义函数时,改变了函数的链接属性,(正常的函数是由外部链接属性的,即可以在不同的.c源文件中用external引用),使用了static之后变为内部链接属性,实际用法与全局变量一致,不可在其他.c文件中使用
Static修饰成员
Static修饰成员变量
Static修饰的成员变量,它不属于单个对象,它属于所有对象,属于整个类。所以它不能在声明部分添加缺省值(不能在某个对象内定义),它只能在类外定义。
如果要访问到n,可以写个GetN成员函数,在类内访问到n并且返回。
Static修饰成员函数
Static修饰的成员函数,和普通成员函数区别:没有this指针。所以static成员函数的作用一般只有一个,就是负责访问静态成员变量。当我们要访问static修饰的成员变量时,只能用static修饰的成员函数来访问,使用成员函数时,要写成类域::静态成员
Static修饰成员的特性:
1. 静态成员变量为所有类对象所共享,不属于某个具体的对象,存放在静态区
2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制
静态成员变量和静态成员函数的使用案例:
案例1:求1 + 2 +3+...+n
题目:求1 + 2 +3+...+n,要求不能使用乘除法、位操作符、for、while、if、else
//JZ64求1+2+3++n
//求1 + 2 +3+...+n,要求不能使用乘除法、位操作符、for、while、if、else
class A
{
public:
A()
{
sum += c;
c++;
}
//静态成员变量只能用静态成员函数访问到
static int Getsum()
{
return sum;
}
private:
//声明两个静态成员,一个用于存总值,一个当做从1开始不断+1的变化值
static int sum;
static int c;
};
//定义静态成员变量
int A::sum = 0;
int A::c = 1;
//使用静态成员变量
class Solution {
public:
int Sum_Solution(int n) {
//n=10,正常情况下用变长数组来创建
//A al[n];//变长数组
//但当前版本不能使用变长数组,所以使用10来代替
A a1[10];
return A::Getsum();
}
};
int main()
{
Solution s;
int ret=s.Sum_Solution(10);
cout << ret << endl;
}
案例2:单例模式
单例模式是指:一个类只能创建一个对象(这个对象是全局的),即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
根据这一特点,我们很快想到要用static修饰变量,因为static修饰的变量在类内只是声明,在类外初始化(定义),是一个全局变量,属于所有类。所以static修饰的变量也只会有一个。具体单例模式实现就不详细介绍了。