static
介绍
static 是修饰静态变量的关键字,可以修饰函数和变量,使他成为静态函数和静态变量,一般存储在静态区。静态全局变量和普通全局变量一般并无差别,只有作用域的差别,静态全局变量仅在本文件中有效,非静态全局可以通过extern , 一般来说,全局静态变量存储在data和BSS区,其中data区存放已经实例化的全局变量和静态变量。 BSS初始值为0,在程序结束的时候 自动释放,其中BSS段在程序执行之前被自动清0,存储在静态数据区的变量会在程序开始时完成唯一一次初始化。
机制
静态数据成员在一开始的时候必须存在,因为函数在程序中运行,所以静态数据成员不能再任何函数内分配空间和初始化
用途
修饰变量的时候,在在main函数运行之前存储在静态区。有初始值就初始化它,没有就默认初始值
对于全局静态变量而言,只是修改了其作用域,作用域缩小为当前文件。其他文件使用extern 声明也获取不到
对于局部静态变量而言,只是修改了其存储区,当定义它的函数和语句结束时候,其作用域也随之结束,但他始终存储在全局数据区,直到程序运行结束,和静态全局变量一样。
修饰普通函数,修改的是作用域,仅在本文件中有效。
修饰成员变量,修改的是作用域,在该文件中有效。
修改成员函数,表明不需要生成对象就可以访问函数,但是static函数不能访问非静态成员,不能有this指针,修改的是存储区域。
注意点
不能同时和const 修饰成员函数,static不能访问非静态成员变量,const不能修改非mutable成员变量,也不能使用非const 成员函数。
static 不能有 this 指针
优势
- 节省内存
- 静态数据成员值对每个对象都是一样的,值可以更新
- 只更新一次,所有对象获取相同的值,提高效率。
this指针
介绍
C++ this 指针主要是给非静态函数用来访问对象中的一些成员变量用的。
机制
每个非静态函数中自带一个隐藏的this指针的,当对象访问一个非静态函数的时候,该对象会隐式的转换为className const this,然后调用函数。 func(this,arg),静态成员函数没有this 指针,当一个成员函数使用成员变量或调用成员函数,编译器会转为this->member指针
用途
当参数和变量重名时候,可以用this来解决冲突,this不是一个常规变量而是一个右值
在类内部可以访问其他变量
返回当前对象的引用
在析构函数和构造函数中使用其他的成员函数。