王桂林讲C++之static

王桂林讲C++之static

static在C语言中就已经存在,主要有以下几个用法:

  1. 定义为全局静态变量
    • 不会被其他文件所访问,修改
    • 其他文件中可以使用相同名字的变量,不会发生冲突
  2. 定义为局部静态变量
    在局部变量之前加上关键字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}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值