变量仅在创建区域内可用。 这称为作用域(scope)。本主主要介绍一下C++中的作用域(scope)及命名空间。

1、局部变量

定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。

例如,

#include <iostream>
using namespace std;
int fn(int a){
    int b,c;  //a,b,c仅在函数fn()内有效
    return a+b+c;
}
int main(){
    int m,n;  //m,n仅在函数main()内有效
    return 0;
}

2、全局变量

在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .cpp 和 .h 文件。

例如,

#include <iostream>
using namespace std;
int a, b=3;  //全局变量
void fn(){
     cout << a << endl << b << endl;
}
int main(){
    fn(); 
    cout << a << endl << b << endl;
    return 0;
}

3、局部变量与全局变量的区别

1)局部变量是声明在块或者函数内部的变量。局部变量的作用域局限于该块或者函数。局部变量如果没有初始化,将包含垃圾数据。

2)全局变量是在所有块和函数之前声明的变量。全局变量对所有在它之后声明的函数有效。全局变量有默认值初始化,如0

注意:如果要调用另外一个文件中的全局变量,如果再声明一个同名的全局变量,那么编译器会因为重名报错,这个时候就要使用extern变量。extern声明告诉编译器这个变量的定义在其他文件中,所以并不会为它分配内存。

4、静态局部变量和静态全局变量区别

1)非静态全局变量的作用域是整个源程序 ,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

2)静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

5、C++命名空间

命名空间是ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。可以建立多个相互分割的作用域,把实体进行分隔,以免名字冲突。

1)访问命名空间中作用域内实体

命名空间名::命名空间成员名;

2)标准命名空间std

C++标准库所有标识符都是在一个名为std的命名空间中定义的,或者说标准头文件中函数、类和对象模板是在命名空间std中定义的。可以在文件开头加入 using namespace std;使用时就可以不写std::

使用示例:

#include <iostream> 
using namespace std;   
namespace Animal
{
    void Show()
    {
        //如果上面没using namespace std; 则使用cout需要std::cout
        cout << "Animal" << endl;
    }
}
namespace Person
{
    void Show()
    {
        //如果上面没using namespace std; 则使用cout需要std::cout
        cout << "Person" << endl;
    }
}
int main()
{
    Animal::Show();
    Person::Show();
    return 0;
}

推荐文档