C++命名空间

一、命名空间的概念
在C++中,变量、函数和类都是大量存在的,它们都存在与全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字。

二、命名空间的定义
一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。没有名称的命名空间,它的成员只在声明该命名空间的文件中可以访问,访问时不需要加命名空间名称,对于其他文件该命名空间中内容不可见。

1、普通的命名空间

//(1)
namespace N1  //N1为命名空间的名称
{
    //命名空间的内容既可以是变量,也可以定义函数
    int a;
    int Add(int left, int right)
    {
        return left + right;
    }
}

//(2)同一工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
namespace N1
{
    int Mul(int left, int right)
    {
        return left * right;
    }
}

2、嵌套的命名空间

namespace N2
{
    int a;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }
    namespace N3 //嵌套函数
    {
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

3、没有名称的命名空间

namespace
{
    int a;
    int Div(int left, int right)
    {
        if (0 == right)
        {
            exit(0);
        }
        return left / right;
    }
}

三、命名空间的使用
命名空间中成员该如何使用?
1、错误的使用
【例1】

#include<iostream>
using namespace std;

namespace N
{
    int a = 10;
    int b = 20;
    int Add(int left, int right)
    {
        return left + right;
    }

    int Sub(int left, int right)
    {
        return left - right;
    }
}

int main()
{
    printf("%d\n", a);//该语句编译出错,无法识别“a”
    return 0;
}

编译结果:
这里写图片描述
释:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,想使用命名空间中的数据需要引用的方式。

2、命名空间使用的方式
(1)加命名空间名称及作用域限定符

int main()
{
    printf("%d\n", N::a);
    return 0;
}

(2)使用using将命名空间中成员引入

using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}

(3)使用using namespace命名空间名称引入

using namespace N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    cout << Add(10, 20) << endl;
    return 0;
}

【例2】

#include<iostream>
using namespace std;

namespace N
{
    int a = 10;
    int b = 20;

    int Add(int left, int right)
    {
        return left + right;
    }

    int Sub(int left, int right)
    {
        return left - right;
    }
}

using N::b;//使用命名空间中变量“b”
using namespace N;//使用命名空间“N”

int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    cout<<Add(10, 20)<<endl;
    system("pause");
    return 0;
}

运行结果:
这里写图片描述
释:
(1)标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。
(2)在采用标准C++的平台上使用标准C++库中的组件,都要写一个using指示符,即“using namespace std”就可以使用标准C++库中的所有成员,或者以std::成员的方式也可以使用C++库里的成员。
(3)“::”是作用域解析符。

【例3】

#include <iostream>

using namespace std;

namespace bit1
{
    int n = 0;
}

namespace bit2
{
    int n = 10;
}

int n = 100;

int main()
{
    n = 1000;
    cout << bit1::n << endl;
    cout << bit2::n << endl;
    cout << ::n << endl;
    cout << n << endl << endl;

    int k;
    cout << "请输入数字:" << endl;
    cin >> k;
    cout << k << endl;

    system("pause");
    return 0;
}

运行结果:
这里写图片描述
释:
(1)cout是标准输出流对象(屏幕),<<是输出操作符;
(2)cin是标准输入流对象(键盘),>>是输入操作符;
(3)endl是换行操作符。
(4)当作用域解析符前不加任何限定符时,输出的是局部变量的值,就近原则。
(5)使用C++输入输出更方便,不需增加数据格式控制,比如:整型–%d,字符–%c。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值