C++入门—命名空间

命名空间

        在C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

#include <stdio.h>
#include <stdlib.h>
 
int rand = 10;
 
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
    printf("%d\n", rand);
    return 0;
}
 
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

命名空间的定义

        定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

//定义一个名字为A的命名空间(变量、函数)
namespace A 
{
    int a = 100;
}
namespace B 
{
    int a = 200;
}
void test02()
{
    //A::a  a是属于A中
    cout<<"A中a = "<<A::a<<endl;//100
    cout<<"B中a = "<<B::a<<endl;//200
}
命名空间只能全局范围内定义

     下面就是错误的写法  (局部定义命名空间是错误的)

int main()
{
    namespace A  //局部定义命名空间是错误的
    {
        int a = 1;
    }
    namespace B
    {
        int a = 2;
    }
    count << "A::a : " << A::a << endl;
    count << "B::a : " << B::a << endl;
    return 0;
}
命名空间可以嵌套定义
namespace A 
{
    int a = 1000;
    namespace B 
    {
        int a = 2000;
    }
}
void test03()
{
    cout<<"A中的a = "<<A::a<<endl; //1000
    cout<<"B中的a = "<<A::B::a<<endl; //2000
}
允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
namespace A 
{
    int a = 100;
    int b = 200;
}
 
namespace A 
{
    int c = 300;
}
void test04()
{
    cout<<"A中a = "<<A::a<<endl;//100
    cout<<"A中c = "<<A::c<<endl;//200
}
命名空间可以存放的变量类型

        在C++中,命名空间(namespace)可以存放各种类型的变量,包括但不限于以下类型


1.基本数据类型变量,如整型(int)、浮点型(float)、字符型(char)等
2.自定义的结构体(struct)或类(class)的对象
3.枚举类型(enum)的变量。
4.指针类型变量,可以指向不同类型的数据
5.数组类型变量,可以是一维或多维数组。
6.函数指针类型,指向特定函数的指针。
7.类型别名(typedef)或类型定义(using)。

命名空间中的函数 可以在“命名空间”外 定义


namespace A 
{
    int a=100;//变量
 
    void func();
}
 
void A::func()//成员函数 在外部定义的时候 记得加作用域
{
    //访问命名空间的数据不用加作用域
    cout<<"func-a = "<<a<<endl;
}
 
void funb()//普通函数
{
    cout<<"funb-a = "<<A::a<<endl;
}
void test06()
{
   A::func();
    funb();
}
无名命名空间

        意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可以作为内部连接

namespace
{
    int a = 10;
    void func()
    {
        cout<<"hello namespace"<<endl;
    }
}
void test()
{
 
    //只能在当前源文件直接访问a 或 func
    cout<<"a = "<<a<<endl;
    func();
}

命名空间的使用

使用using将命名空间中某个成员引入
namespace N
{
    // 命名空间中可以定义变量/函数/类型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {
        return left + right;
    }
    struct Node
    {
        struct Node* next;
        int val;
    };
}
using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}
使用using namespace 命名空间名称 引入
namespace N
{
    // 命名空间中可以定义变量/函数/类型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {
        return left + right;
    }
    struct Node
    {
        struct Node* next;
        int val;
    };
}
 
using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值