C语言中static变量
在c语言中,static关键可以用来修饰变量,作用如下:
#include<stdio.h>
void count(){
static int num = 0;
// int num = 0;
num++;
printf("%d ", num);
}
int main(){
for(int i=0; i < 5; i++){
count();
}
printf("\n");
return 0;
}
被static修饰的变量称之为静态变量。在某些场景下,我们希望函数中就局部变量的值在函数调用结束之后不会消失,保留其原值,即所占用的存储单元不释放。当局部变量声明为静态局部变量的事后,就改变了该局部变量的在内存中的位置,从原来的栈存放修改为静态存储区域。
全局变量与静态局部变量的区别:全局变量属于静态存储方式,静态局部变量也属于静态存储方式,但是静态局部变量与全局变量的主要区别在于静态局部变量只能在被声明的代码块中是可见的。
C++中的static变量
类实例化出的对象,不同的对象占用不同的内存,这使得对象的成员变量相互独立。但是在某些情况下,我们希望对个对象之间进行数据共享,这个时候可以在类的声明的时候给成员变量加上static关键字让其变成静态成员变量。
static静态成员变量属于类,不属于某个具体的对象。即无论创建多少个对象,只给该静态局部变量分配一份内存。**但是需要注意的是static成员变量必须在类声明的外部初始化。**static成员变量不占用对象的内存,而是在所有对象之外开辟内存,在类外部初始化分配内存。
普通的成员变量在对象创建的时候分配内存,在对象销毁时释放内存,而static成员变量不随对象的创建而分配内存,也不随对象的销毁释放内存。使用方式如下:
#include <iostream>
using namespace std;
class Student{
private:
string m_name;
int m_age;
float m_score;
private:
static int m_total;
public:
Student(string name, int age, float score);
void show();
};
// 静态成员变量需要在类外部初始化
int Student::m_total = 0;
Student::Student(string name, int age, float score):m_name(name), m_age(age), m_score(score){
m_total++;
}
void Student::show(){
cout << "name: "<< this->m_name << " " << "age: " << this->m_age << " " << "score: " << m_score << endl;
cout << "total: " << m_total << endl;
}
int main(){
Student *stu1 = new Student("xiaozhang", 23, 60); //new创建出的对象是指针类型
stu1->show();
Student stu2("xiaoming", 25, 66); // 创建对象的第二种方式,可以使用"."来访问成员变量和成员函数
stu2.show();
(new Student("xiaohua", 29, 90))->show(); // new创建的对象是指针类型,需要用"->"
}
##c++中的静态成员函数
普通的成员函数在编译的时候,会默认给成员函数加上一个形参this,所以普通的成员函数只能在创建对象之后通过对象来调用,因为它需要当前对象的地址。而静态函数可以通过类来直接调用,编译器不会给它增加形参。静态成员变量没有this指针,只能调用静态成员函数。
想不通过生成对象的方式调用类的成员函数,需要在定义的时候给函数加上static关键字。