作用域和static、const、auto、extern关键字

作用域:

            作用域是一个标识符在程序正文中有效的区域,它包含有函数原型作用域、局部作用域(块作用域)、类作用域和命名空间作用域。

            1、函数原型作用域

            函数原型声明时形参的作用范围就是函数原型作用域。

            例如:int area (int x,int y)

            2、局部作用域(块作用域)

            函数形参列表中形参的作用域、从形参列表的声明处开始,到整个函数体结束之处为止。(从声明开始到花括号为止)

            函数体内声明的变量,其作用域从声明处开始,一直到所在块结束的大括号为止。(  {        在这之间作用       }  )
            
            具有局部作用域的变量也称为全局变量。

            3、类作用域

            类的成员具有类作用域。当需要访问类中成员时,有如下三种方式:

            (1)如果类中的成员函数没有声明同名的局部作用域标识符,那么该函数可以直接访问该成员。

            (2)通过表达式X.a或者X::a。访问对象成员。

            (3)通过指针访问:ptr->a

            4、命名空间作用域
            
            命名空间语法:
          
            namespace 命名空间名{
               
                命名空间内的声明(函数声明、类声明等) }
 
             当需要引用在其他命名空间中声明的标识符时:命名空间名::标识符名
      
             或使用using语句:
      
             (1)using 命名空间名::标识符名 (将指定的标识符暴露在当前作用域内)

             (2)using namespace 命名空间名 (将该命名空间内所有的标识符暴露在当前作用域内)
           
             具有命名空间作用域的变量也称为全局变量。

Static:
            
            在命名空间作用域中声明的对象都是具有静态生存期的,若在函数内部的局部作用域中声明具有静态生存期的对象,就需要使用static。

            1、静态全局变量
              
              #include<iostream>
             using namespace std;
             static int m;

             当全局变量定义为静态全局变量时,它不能被其他文件所用。在其他文件时定义了相同名字的变量,不会发生冲突。

             全局变量在需要在另一个文件中使用时,可以通过extern全局变量的声明来使用。但是全局静态变量不行。

             2、静态局部变量

             局部作用域中静态变量不会随着每次函数的调用产生副本,也不会随着函数的返回而失效。

             (1)该变量在全局数据区分配内存。

             (2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化。

             (3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。

             (4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

              3、静态函数成员

              静态成员函数可以直接访问该类中的静态数据和函数成员,而访问非静态成员时,须通过对象名。

Const:

              对于需要声明不可改变(需要共享又防止改变)的常量时,使用const。

             1、常对象

             常对象的数据成员值在对象的整个生存期内不能改变。常对象必须初始化,而且不能被更新。

             2、常成员函数   :void print() const;

             (1)如果一个对象为常对象,则通过常对象只能调用它的常成员函数。

             (2)常成员函数不能更新目的对象的数据成员。
            
              const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员,
      
              非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员。

              3、常引用
 
             常引用的对象不能被更新。常引用可以绑定到常对象,而非const的引用不行。

Auto:

            用来声明自动变量,根据变量的初始值得类型自动选择匹配的类型。auto变量必须在定义时初始化。
 
            1、 用来代替复杂,使用范围专一的变量声明。   

            2、用来代替变量的类型(变量需被初始化)。 如 int i =12;auto a =I;       

            3、用于无法确定变量类型的时候。

            4、auto变量在离开作用域时程序自动释放,不会发生内存溢出。

Extern:

           在一个文件中定义了一个变量后,若需要在另一个文件中使用这一变量时需要使用extern关键字加以声明。

           不用extern关键字声明的变量都是定义性声明;用extern关键字声明的变量,如果赋予了初值,则是定义性声明,否则是引用性声明。

           外部变量可以有多处声明,但对变量定义性的声明只能是唯一的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值