C++自学笔记9(静态变量static)

static根据上下文含义主要分为两类

一是在结构体或类之内使用的static

二是在结构体或类之外使用的static

结构体或类之外使用的static

结构体或类之外使用的static就是说其定义的变量只在本文件有效,只链接在本文件中。我们举个栗子。

//static.c
static int var = 8;

我们在static.c文件中对var设置静态并赋值为8.

//main.c
#include <iostream>

int var = 10;

int main()
{
    std::cout<<var<<std::endl;
    std::cin.get();
}

我们在main.c文件中定义var并赋值为10,想想看运行后会打印几呢?

10

因为static.c文件中var是静态变量所以仅仅只在static.c文件中有效。main.c文件的链接器链接到static.c文件中找不到var,相当于被其他文件屏蔽了。所以main函数调用的var的值就是10;

如果我们改变stati.c文件变量使其从静态变量变为全局变量

//static.c
 int var = 8;
//main.c
#include <iostream>

int var = 10;

int main()
{
    std::cout<<var<<std::endl;
    std::cin.get();
}

 我们再次运行会发现报错,原因是什么呢?

var在main.c文件定义,链接器链接到static.c发现也定义了var,重复定义系统将报错。

如果我就是想在stati.c文件内对var定义,从其他文件链接查找var怎么办。如下

//static.c
 int var = 8;
//main.c
#include <iostream>

extern int var ;

int main()
{
    std::cout<<var<<std::endl;
    std::cin.get();
}

 我们用到关键字extern,其代表了var已经被定义过了,在其他文件可以找到,剩下的就交给链接器了。

static int var = 8;就像是类中private的私有变量,类外函数不可调用一样。static就是static.c文件中的私有变量,链接器这个全局搜索不可访问他。

static不单单只对变量设置静态,函数、结构体、类都可以设置。

结构体或类之内使用的static

 static对静态数据,让其在不同实例(e、e1就是两个实例)保持相同值。

struct Entity
{
    int x,y;

    void Print()
    {
         std::cout<<x<<","<<y<<std::endl;
    }
};
int main()
{
    Entity e;
    e.x = 1;
    e.y = 2;

    Entity e1;
    e1.x = 10;
    e1.y = 20;

    e.Print();
    e1.Print();
    std::cin.get();
}

 我们使用结构体,你使用类也可以,使用struct就是它默认变量与方法公有。

以上结构体Entity我们创建e和e1分别对其赋值1、2和10、20,调试台打印出来的也正是

1、2

10、20

我们将变量改成静态会发生什么?

struct Entity
{
    static int x,y;

    void Print()
    {
         std::cout<<x<<","<<y<<std::endl;
    }
};

int Entity::x;
int Entity::y;

int main()
{
    Entity e;
    e.x = 1;
    e.y = 2;

    Entity e1;
    e1.x = 10;
    e1.y = 20;

    e.Print();
    e1.Print();
    std::cin.get();
}

int Entity::x;
int Entity::y;

静态变量我们需要再某处对其定义,便于链接器找到相应的变量。“::”作用域说明x、y是Entity下的变量。 

运行后调试台

10、20

10、20

我们说 static对静态数据,让其在不同实例(e、e1就是两个实例)保持相同值。e中对xy分别赋值1和2,e1中则对其修改为10和20.就是说e和e1两个实例指向的地址是同一个,e1改写后就覆盖掉了e的值,得到了两次1020。

内部的静态变量可以让我们创建的变量,在各个实例里保持相同。

他的意义是什么?

如果你有一条信息需要在类中各个实例分享,那么静态就很有用。或者说某个数据在必须在类内存在,那么你就必须设定一个静态变量,而不是放在全局上到处都可以被引用。

========================================================================

函数作用域下的static(局部静态变量)

以上是在类或结构体作用域中使用静态变量,我们还可以在函数作用域中使用,以如下例子观察。

void function()
{
    int i = 0;
    i++;
    std::cout<<i<<std::endl;
}
int main ();
{
    function();
    function();
    function();
    function();
    function();
    std::cin.get();
}

 我们建立函数,其i初始值为0,然后i+1打印。在main函数中调用五次,调控台为

1

1

1

1

1

我们可以看到,第一次引用function时在这个函数作用域的i在打印i'值之后就被销毁。第二次引用时i重新被创建并赋值为0,再加一打印,反复五次。

void function()
{
    static int i = 0;
    i++;
    std::cout<<i<<std::endl;
}
int main ();
{
    function();
    function();
    function();
    function();
    function();
    std::cin.get();
}

将i变成静态变量,调控台打印为

1

2

3

4

5

第一次引用function时在这个函数作用域的i在打印i'值之后没有被销毁,依旧在以i=1存在。第二次引用时i的值为1,再加一打印使之变成2,反复五次。

我们可以看到函数作用域下的变量在函数销毁后,静态变量并没有销毁。这有什么用呢?

我们再来举一个栗子。

static int i = 0;
void function()
{
    i++;
    std::cout<<i<<std::endl;
}
int main ();
{
    function();
    function();
    function();
    function();
    function();
    std::cin.get();
}

还记得在类或结构体外的static表示该变量仅仅在本文件有效,此时我们只有一个文件所以使用static int i = 0;与 int i = 0;是一样的。打印出来依旧是

1

2

3

4

5

但是我们在main函数再给i赋值就会

static int i = 0;
void function()
{
    i++;
    std::cout<<i<<std::endl;
}
int main ();
{
    function();
    function();
    i = 10;
    function();
    function();
    function();
    std::cin.get();
}

打印台为

1

2

11

12

13

这就是局部静态变量的存在意义,它使得我们不可以在函数外对其值进行更改,只有在调用函数时才可以改变他的值。

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少杰是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值