C++小结--static关键字的使用

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u014421520/article/details/79878616

1 static是什么

static是c/c++的一个关键字,主要有两个作用:
1 限定作用域,
2 保持变量的持久化。

2 在C语言中static的用法

2.1 全局静态变量

  用法:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。 static int temp;

  内存中的位置:静态存储区,在整个程序运行期间一直存在。

  初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);

  作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾,这样就可以防止在多个文件中变量重名的问题。

2.2 局部静态变量

  在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。

  内存中的位置:静态存储区

  初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);

  作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问(不是完全不能访问,我们可以通过指针来访问,不过不建议那样做),直到该函数再次被调用,并且值不变。

2.3 静态函数

  在函数返回类型前加关键字static,函数就定义成静态函数。函数的定义和生命在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用;
  

3 在C++中static的用法

我们知道,C++是继承并发展C语言的,所以static关键字在C++中也保留了C语言中的三个基本用法,不过还对它进行了扩充,主要是用在类中。

3.1 类的静态成员

  class A{
  private:
    static int val;
  };

  在C++中必须对他进行初始化,初始化时使用作用域运算符来标明他所属类,其属于该类的所有成员共有,只有一个拷贝;也就是说,我们在使用该类申明多个对象时,各个对象都共享此一个变量。我们可以利用这个特性实现单例模式,后续会介绍。

3.2 类的静态成员函数

  class A{
  private:
       static int func(int x);
  };

   实现的时候也不需要static的修饰,因为static是声明性关键字;类的静态函数是该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,他就是增加了类的访问权限的全局函数;

 void  A::func(int);

  静态成员函数可以继承和覆盖,但无法是虚函数;

3.3 实践演示

#include <iostream>
using namespace std;

class c_stu
{
public:
    int a;

    //1、静态成员属于类的一个属性,不属于一个对象的属性。
    //2、在编译器编译的时候,他就已经存在。
    //3、静态成员可以作为类创建对象的一个沟通的桥梁。
    static int b;  
    //静态成员函数必须使用静态成员变量,不能访问非静态成员变量
    static void func();

};

//类外初始化
int c_stu::b = 10;
//类外实现,不需要加关键字static
void c_stu::func()
{
    int x = 100;
    int y = 200;
    int z = x + y;
    b = 13;
    cout << "&z = " << &z << endl;
    cout << "&b = " << &b << endl;

}


int main()
{
    //类名作用域可以直接访问静态成员变量和静态成员函数
    cout << c_stu::b << endl;
     c_stu::func();

    //对象也可以访问
    c_stu stu;
    cout << stu.b << endl;
    stu.func();

    system("pause");
    return 0;
}

运行结果:

10
&z = 0113F8C8
&b = 00BEC000
13
&z = 0113F8C8
&b = 00BEC000
请按任意键继续. . .

结果分析:我们看到直接通过类调用和通过对象调用,z和b的地址是一样的,所以证明了z和b只有一份,也就是说static修饰的函数和变量是类共有的,所有的对象都访问同一个函数和变量。这也就可以解释为什么static成员函数不能访问非静态成员变量。

4 总结

static关键字在C++中扩充了其内容,主要是在类中进行了扩充。需要好好体会并理解这样设计的目的,很多类中很巧妙的利用static的特性来实现一些有用的功能,比如类的实例化对象个数计数,单例模式实现等等。

猜你喜欢

转载自blog.csdn.net/u014421520/article/details/79878616
今日推荐