编程语言
首页 > 编程语言> > C++_static关键字

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