static关键字

来源:互联网 发布:流水账软件 编辑:程序博客网 时间:2024/05/21 22:38

一 概述:

*static在c++中主要有两种用法:面向过程中的static和面向对象中的static。

*前者主要针对变量和函数,后者主要针对在类中的作用。


二 面向过程中static:

(1)静态全局变量:

*在全局变量前面,加上关键字static,该变量就定义为静态全局变量。

*特点:

~在全局数据区分配内存;

~在声明它的整个文件可见,在文件之外不可见即不能被其他文件所用;
~其他文件定义相同的变量名不会发生冲突。(优点)


(2)静态局部变量

*在局部变量前面,加上关键字static,该变量就定义为静态局部变量。

*特点:

~在全局数据区分配内存;

~它始终驻留在全局数据区,除非程序结束。但是作用域是局部作用域,定义它的函数或者语句块结束时,作用域随之结束。


*例如:
#include<iostream>using namespace std;void test(){static int a=10;cout<<++a<<endl;}int main(){/*多次调用一个具有local static成员的函数,只存在一份local static成员。*/test();//值为11test();//12test();//13//cout<<a<<endl;//错误,超出作用域。}

三 静态函数
(1)在函数返回类型前加上static,函数即被定义为静态函数。

(2)特点:

*只在定义的文件中可见,不被其他文件使用;

*其他文件可以定义相同名字的函数,不会发生冲突.(优点)


三 类中的static
(1)static类成员:
         *对于特定类类型的全体对象而言,访问一个全局对象有时是必要地。然而全局对象会破坏封装,所以类可以定义静态数据成员。static数据成员独立于该类的任意对象而存在:每个static数据成员是与类关联的对象,并不与该类的对象相关联。
         *static成员函数没有this形参,可以直接访问所属类的static成员,但不能直接使用非static成员。(原因可能和编译、链接有关)


(2)使用类的static成员的优点:

         1.static成员的名字是在类的作用域中,因而可以避免与其他类的成员或者全局对象名字冲突。
         2.可以实施封装。static成员可以是私有成员,而全局对象不可以。
         3.static成员是与特定类关联的。


(3)定义static成员:

          1.static数据成员:
          static数据成员可以声明为任何类型,必须在类定义体的外部定义(正好一次),不像普通数据成员,static数据成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
          static关键字只能用于类定义体内部的声明中,定义不能标示为static。
          
          2.static成员函数:例如:static void test();

          static成员函数:没有this指针;不能被声明为const;不能被声明为虚函数。

  static成员不是任何对象的组成部分,将成员函数声明为const就是承诺不修改函数所属的对象,所以  static成员函数不能为const(const对传递的this指针加以限定不修改对象,而static无this指针)。


(4)使用类的static成员:

          可以通过作用域操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用。
原创粉丝点击