王桂林讲C++之static
static在C语言中就已经存在,主要有以下几个用法:
- 定义为全局静态变量
- 不会被其他文件所访问,修改
- 其他文件中可以使用相同名字的变量,不会发生冲突
- 定义为局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
- 变量在内存中的位置变为静态存储区
- 初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
- 作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。但是,在下一次访问它的函数的时候,它仍然保持原来的值
C++对C完全兼容,故C++中这些用法依然存在。
同时,C++中引入了类,static与类又产生了反应,故增加了新的用法。下面从三个方面来阐述:
- static修饰类成员变量
- static修饰类成员函数
- const static作用
static修饰类成员变量
在类中声明一个static类型的成员变量,那么这个成员变量将会被这个类所有的对象所共享。简单点说,static成员变量的作用就是实现类对象数据共享。
a. 在类中如何声明和初始化static成员变量?下面用一个例子来说明:
//main.cpp
class A
{
public:
static int share; //声明一个static类型的变量
}
int A::share = 0; //static类型的变量必须要在类外初始化,初始化格式为:类型 类名::变量名 = 值
b. static成员变量归属谁
关于static变量的归属,记住一句话:static是属于类的,也是属于对象的,但最终是属于类的。所以static成员变量的调用方式有两种:
A::share;
A a ; a.share; 或者 A *a = new A; a->share;
c. static共享特性用法,下面用一例子来说明:
//main.cpp
#include <iostream>
class A
{
public:
A(int n):
{
share = n;
}
static int share;
}
int A::share = 0;
int main()
{
A::share = 1;
A a(2);
A b(3);
std::cout<<"A::share = "<<A::share<<std::endl;
std::cout<<"a.share = "<<a.share<<std::endl;
std::cout<<"b.share = "<<b.share<<std::endl;
return 0;
}
输出结果为,
A::share = 3
a.share = 3
b.share = 3
d. static成员变量存储位置
普通成员变量,存在于每个类对象开辟的空间中,每个对象都为其开辟空间。而static成员变量,存在于数据段或者BSS段(未初始化时),每个对象不会为其开辟空间。下面用一例子来说明:
//main.cpp
#include <iostream>
class A
{
public:
A(int n):
{
share = n;
}
static int share;
int x;
}
int A::share = 0;
int main()
{
A a(1);
std::cout<<"size(a) = "<<sizeof(a)<<std::endl;
return 0;
}
输出结果为,
size(a) = 4
static修饰类成员函数
static修饰类成员函数,作用比较简单,就是为了去管理static成员变量。但是,有两点需要注意:
- static成员函数在定义的时候,不需要带static关键字;
- static成员函数中,不存在this指针,所以它无法调用非static成员。
const static作用
如果要声明一个不可修改的static成员变量,则前面加const关键字。值得注意的是,const static类型初始化,必须要当场初始化。下面用一例子来说明:
//main.cpp
class A
{
public:
const static int share = 10; //如果只需要一个固定数值,采用枚举enum{share = 10}
}