作用域:
作用域是一个标识符在程序正文中有效的区域,它包含有函数原型作用域、局部作用域(块作用域)、类作用域和命名空间作用域。
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关键字声明的变量,如果赋予了初值,则是定义性声明,否则是引用性声明。
外部变量可以有多处声明,但对变量定义性的声明只能是唯一的。