C++_static关键字
作者:互联网
c++的内存分区
堆 / 栈 / 全局/静态存储区(static)/ 常量存储区(const)
1.1.1静态全局变量
静态变量在全局数据区分配内存,在声明的整个文件内可见的,在文件之外是不可见的,其他文件可以定义相同名字的变量,不会发生冲突
注:全局数据区的数据不会因函数的退出而释放空间
#include <iostream>
using namespace std;
static int n;
void fn()
{
cout << n << endl;
n++;
}
int main()
{
n = 10;
fn();
fn();
fn();
fn();
}
1.1.2局部静态变量
#include <iostream> using namespace std; void fn() { static int n = 10; cout << n << endl; n++; } int main() { fn(); fn(); fn(); fn(); }
通常函数局部变量分配为堆内存,退出函数体,系统会收回栈内存
静态变量全局数据区分配内存,不会随着函数退出回收内存
1.1.3静态函数
静态函数不能被其它文件所用
其他文件可以定义相同的函数,不会发生冲突
#include <iostream> using namespace std; static void fn(); void fn() { int n = 10; cout << n << endl; n++; } int main() { fn(); }
1.1.4静态数据成员
#include <iostream> using namespace std; ; class A { private: int a, b, c; static int sum; public: A(int a, int b, int c); void GetSum(); }; int A::sum = 0; A::A(int a, int b, int c) { this->a = a; this->b = b; this->c = c; sum += a + b + c; } void A::GetSum() { cout << "sum = " << sum << endl; } int main() { A a(1, 2, 3); a.GetSum(); A b(4, 5, 6); b.GetSum(); return 0; }
注:非静态数据成员每个对象都存在自己的拷贝
静态数据成员被当作类的成员,一个类如被实例多次,但只存在一份拷贝
静态数据成员是所有对象共有的,静态数据成员只分配一次内存
1.1.5静态成员函数
#include <iostream> using namespace std; ; class A { private: int a, b, c; static int sum; public: A(int a, int b, int c); void print(); static void GetSum(); }; int A::sum = 0; A::A(int a, int b, int c) { this->a = a; this->b = b; this->c = c; sum += a + b + c; } void A::print() { cout << "log" << endl; } void A::GetSum() { //静态成员函数不能访问非静态成员函数和非静态数据成员 //cout << a << endl; //print(); cout << "sum = " << sum << endl; } int main() { A a(1, 2, 3); a.GetSum(); A b(4, 5, 6); b.GetSum(); A::GetSum(); return 0; }
普通成员函数相比,静态成员函数无this指针,无法访问类对象的非静态数据成员、非静态成员函数,只能调用其余的静态成员函数。
总结:
静态全局变量/静态函数:
其他文件可以有相同名字变量和函数名,文件外是隐藏的
静态局部变量:
内存分配是全局数据区分配内存
静态数据成员:属于类,仅有一份拷贝,无this指针
静态成员函数:无this指针,不可访问非静态成员函数和非静态数据成员。
标签:静态数据,函数,int,void,C++,关键字,static,静态,成员 来源: https://www.cnblogs.com/zsymdbk/p/14829065.html