首页 > 编程语言 >C++命名空间

C++命名空间

时间:2024-01-21 23:01:06浏览次数:33  
标签:std rand int namespace C++ 空间 命名

C++关键字认识

image-20220712121256178

命名空间

先看一个例子

定义一个rand变量,然后打印 ,这是没问题的

但是如果我们包含头文件 stdlib.h呢?

就会出现重定义问题image-20220712121532228

这是为什么呢?

因为stdlib里面本来就有一个函数叫 rand()

所以当包含了头文件之后,链接的时候会发现 rand重复定义了 --这就是命名冲突问题

C语言怎么解决这个问题呢? 只能改名字

C++注意到了这个问题,所以才有了命名空间这一说

命名空间的定义

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

:: 域作用限定符

命名空间就是一个域,类似于全局域 也有局部域

命名空间既然是一个域,那么就可以定义变量,定于类型(结构体等),定义函数等

::用于访问域,前面是域的名字,后面是访问的内容

命名空间 :: 访问内容

如:

namespace test
{
    int a=10;
}
int main()
{
    printf("%d\n",test::a);//访问 test命名空间里的变量a
    return 0;
}

命名空间域的变量生命周期是全局,但是它属于该命名空间域

全局域也是一个域,里面有定义的全局变量之类的东西

回到上面的问题,rand命名冲突image-20220712121731284

int main()
{
    printf("%d\n",rand);//默认先找改局部(代码块内)
                        // 然后去找全局
    printf("%d\n",暴龙战士::rand);//这样是直接去暴龙战士命名空间去找
    // :: 是访问符号
    return 0;
}

注意

  • 同一个域不可以定义相同名字的变量
  • 而不同的域可以定义相同名字的变量
  • 局部有 先访问局部(局部优先)
  • 如果想访问全局域的内容:直接加一个 :: 前面不加命名空间,即空白,就是默认访问全局域

如下代码:

int a=0;
int main()
{
    int a=10;
    printf("访问局部的a:%d\n",a);
    printf("访问全局的a:%d\n",::a);
    return 0;
}

命名空间在项目中的意义

image-20220712121854340

哪怕名字冲突,在使用过程中也没有影响

只需要指定命名空间就可以了

命名空间的嵌套

命名空间里可以放变量,函数,类型

还可以放命名空间(可以无限套娃)

namespace outer
{
    namespace inner
    {
        int rand=0;
        struct TreeNode{
            struct TreeNode* left;
            struct TreeNode* right;        
        }    
    }
}
int main()
{
    printf("%d\n",outer::inner::rand);//访问rand
    //访问结构体
    TreeNode
    return 0;
}

命名空间的合并

也就是有多个相同名字的命名空间

比如:如果在不同的文件中定义相同名字的命名空间

最后编译器会把相同名字的命名空间的合并到一起 同为一个命名空间

命名空间的使用

using namespace 空间名;

我们可以看到 每一次引用都需要加 空间名::访问内容

很麻烦!

如果在平时的使用,主要用于练习,不考虑冲突 可以使用该方法,就可以省很多麻烦,这样就直接展开了,不需要利用空间名修饰限定了

这时候 先在全局域找,如果没有就去展开的test命名空间里去找

using namespace test;
int main()
{
    //这时候 先在全局域找,如果没有就去展开的test命名空间里去找
    return 0;
}

所以 c++的 usging namespace std; 就好解释了

std是标准库的命名空间

由于怕别人与标准库冲突,所以把标准库的所有东西都放到了std命名空间里面去

所以如果你和标准库定义的某个东西名字一样,就不会冲突

但是如果引入using namespace std; 把标准库展开,就有冲突的风险了

命名空间名称+作用域限定符

如果不展开,不暴露出标准库命名空间,可能会看到这样的代码

(这样是更规范的写法)

#include<iostream>
int main()
{
    std::cout<<"hello"<<std::endl;
    return 0;
}

使用using将部分命名空间中的成员引入

一般把最常用的展开

using std::cout;
using std::cin;
using std::endl;
//这几个比较常用

int main()
{
    /****/
    /****/
    return 0;
}

标签:std,rand,int,namespace,C++,空间,命名
From: https://www.cnblogs.com/iiianKor/p/17978655

相关文章

  • C++U6-03-最短路算法2-bellmon-ford算法
    学习目标贝尔曼福特算法、SPFA 可以用来复习的B站视频:1、https://www.bilibili.com/video/BV1RK4y1d7ct?p=3&vd_source=5c960e1ede940bc5cab8ed42c8bdc9372、https://www.bilibili.com/video/BV18a4y1A7gv/?spm_id_from=333.999.0.0 SPFA算法是 Bellman-Ford算法 的队......
  • C++ ——vector数组笔记
     vector是C++标准库中的一个动态数组容器(SequenceContainer),它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。可以简单的认为,vector是一个能够放任意类型的动态数组。下面详细介绍 vector 的使用方法......
  • 位运算(c++)
    n的二进制表示第k位是几①先把第k位移到最后一位:n>>k②看个位是几:&1n>>k&1lowbit(x):返回x的最后一位1是多少例如1010--->10,101000--->1000实现:x&-x=x&(~x+1)例:输入一个数组返回数组中每个元素二进制形式中1的个数代码:#include<iostream>using......
  • sed的&操作符+复盘和把经验转化为能力+sed替换关联环境变量+SystemC+C++的struct和cla
    sed的&操作符sed一般是按行操作,如果匹配到,那么匹配到的内容被表示为&。以下是在单行操作中,想要实现在某行数据特定字符前后插入字符的方法。复盘和把经验转化为能力https://www.163.com/dy/article/GEI2Q9EN05429MRP.html通过寻找和尝试新的做事方式,你才能提高自己的能力。......
  • 【C++入门到精通】C++入门 —— 类和对象(了解类和对象)
     目录一、类和对象的历史由来 二、面向过程和面向对象的初步认识三、类1.引子2.类的定义 3.类的访问限定符及封装        ⭕访问限定符 ......
  • C++ const 全局变量跨文件引用,无法解析的外部符号?
    前两天群里有人问了这样一个问题:在a文件中定义了一个全局变量,可以在b文件中引用。但一旦把全局变量改为const之后,就无法在b文件中引用,编译(链接)报错“无法解析的外部符号”,这是为什么?这是因为const修饰的变量默认具有文件作用域,如果想和非const变量一样具有全局作......
  • C++中,new与malloc的区别何在?(代码实验向)
    在C++中,new与malloc()都可用于在堆中分配一块内存。其中,new是C++的语法,而malloc则来自古老的C语言,二者在使用时有何区别?new会调用构造函数,而malloc()不会假设有一个矩形类Rect,定义如下:classRect{public:Rect(){/*初始化矩形的宽和高为10*/mWidth......
  • C#学习笔记-类与名称空间
    1.类和对象  类是一个数据结构,将字段和方法组合在一个单元中。类为动态创建实例提供了定义,类的实例化称为对象。C#中的类同样支持继承和多态。C#是完全面向对象的语言,程序本身就是一个类。  如下所示,程序的入口点Main()方法包含在Program类中(与C++不同),类的实例使用new运......
  • 【C++入门到精通】C++入门 —— 引用、内联函数
     目录一、引用1.引用的概念2.引用的特性3.常引用4.引用的使用场景        ⭕做参数        ⭕做返回值5.传值、传引用效率比较值和引用的作为返回值类型的性能比较6.引用和指针的区别 引用和指针的不同点 二、内联函数1.内联函数的概念2.内联函数的特性3.宏与内......
  • C++多重返回值:引用参数、结构体和元组实例详解
     在C++中,函数通常只能返回一个值。但是,可以通过引用参数、结构体、元组(C++11及以后版本支持)等方式实现函数具有多个返回值的效果。以下是其中几种方法的实例:1.通过引用参数:#include<iostream>//通过引用参数实现多个返回值voidmultipleReturns(inta,intb,int&......