C++学习——static

1. static的用法和作用?

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。用static修饰的变量的声明式即为其定义式。如果没有手动的初始化,系统会为该变量提供一个初始值。 但是static变量最好在使用的编译单元里(.c/.cpp)声明定义,如果定义在头文件里,如果头文件被重复引用讲导致变量的重复定义。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

3.static的第三个作用是默认初始化为0(static变量)

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

static的作用

4.static的第四个作用:C++中的类成员声明static

1)   函数体内static变量的作用范围为该函数体,不同于auto变量,
该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;  
#include<iostream>
using namespace std;

class solution {
public:
    int a;

    void print() {
        static int s = 100;
        cout << s << endl;
        s++;
    }
};

int main() {
    solution D1;
    for (int i = 0; i < 5; i++) {
        D1.print();
    }
    return 0;
}
100
101
102
103
104
2)   static修饰的类的成员变量必须要在类外初始化,
static修饰的类成员函数,既可以在类内定义,又可以在类外定义。
#include<iostream>
using namespace std;

class solution {
private:
    static int s;
public:
    static void print() {
        cout << "static print" << endl;
    }//类的静态成员函数可以在类内进行定义
};

int solution::s = 1200;//在类的静态成员变量必须在类外进行初始化。


int main() {
    solution D1;
    D1.print();
    return 0;
}
3)   在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;   
#include<iostream>
using namespace std;

class solution {
private:
    static int s;
public:
    static void print() {
        cout << "static print" << s << endl;
    }
    void pprint() {
        cout << "pprint" << s << endl;
    }
    void ppprint();
};

int solution::s = 1200;

void solution::ppprint() {
    cout << "ppprint" << s << endl;
}
int main() {
    solution D1;
    D1.print();
    D1.pprint();
    D1.ppprint();
    return 0;
}
static print1200
pprint1200
ppprint1200
4)   在模块内的static函数只可被这一模块内的其它函数调用,
这个函数的使用范围被限制在声明它的模块内;   

5)   在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;   

6)   在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,
因而只能访问类的static成员变量。
7)   由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,
this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,
只能访问 static修饰的类成员;

8)   static成员函数不能被virtual修饰,static成员不属于任何对象或实例,
所以加上virtual没有任何实际意义;
静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,
而vptr是通过this指针调用的,所以不能为virtual;
虚函数的调用关系,this->vptr->ctable->virtual function

2.静态变量什么时候初始化

  1. 初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内存。

  2. 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。

  3. 而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值