既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
你是否曾经有那么一丢丢的疑惑`using namespace std;`是干啥的?
稍等,我们再看几个例子,铺垫铺垫:
#include
using namespace std;
#include<stdlib.h>//里面有个叫rand的函数
int rand = 0;
int main()
{
printf(“%d\n”, rand);
return 0;
}
![image-20220502111326193](https://img-blog.csdnimg.cn/img_convert/343675a66f22e2ccd55ba60e92c9efcd.png)
因为<stdlib.h>里面有个叫rand的函数因此我们定义的变量重名了。
为了解决命名冲突问题,CPP引入namespace命名空间定义
**定义命名空间**,需要使用到namespace**关键字**,后面跟**命名空间的名字**,然后接一对{}即可,{}中即为命名空间的成员
#include
using namespace std;
#include<stdlib.h>//里面有个叫rand的函数
//为了解决命名冲突问题,CPP引入namespace
//同一个域里面不能有重名变量
namespace cpp//命名空间域,这里起名为cpp,本空间与外界空间进行隔离
{
int rand = 0;
}
int main()
{
printf(“%d\n”, rand);
return 0;
}
![image-20220502112558635](https://img-blog.csdnimg.cn/img_convert/6f344635e26be00f675ee9e55dd64aa9.png)
成功通过了,但这里打印的不是0,而是一串数字。因为这里打印的是函数rand的地址,而不是rand变量的大小(因为rand变量被cpp命名空间关起来了,函数rand和变量rand就不在同一个域了,不会有命名冲突问题)。
那如果我想要访问变量rand该怎么做呢?我们引入`::` 域作用限定符,访问cpp命名空间里的rand
#include
using namespace std;
#include<stdlib.h>//里面有个叫rand的函数
//为了解决命名冲突问题,CPP引入namespace
//同一个域里面不能有重名变量
namespace cpp//命名空间域,这里起名为cpp,本空间与外界空间进行隔离
{
int rand = 0;
}
int main()
{
printf(“%d\n”, cpp::rand);//:: 域作用限定符,::前面是空白就默认全局域
return 0;
}
![image-20220502174334893](https://img-blog.csdnimg.cn/img_convert/3b6e1a9a4bd3ae163638a5d9afecf1c9.png)
### 2.1 命名空间定义
1️⃣命名空间中的内容既可以定义变量,也可以定义函数和类型
namespace tyyg // tyyg为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数和类型
int a;//变量
int Add(int left, int right)//函数
{
return left + right;
}
struct ListNode//类型
{
int val;
struct ListNode\* next;
};
}
2️⃣命名空间可以嵌套使用,例如:
namespace OUT//外
{
int a;
int b;
namespace IN//内
{
int c;
int Sub(int left, int right)
{
return left - right;
}
}
}
3️⃣同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//data.h
namespace abc
{
int a = 0;//a还是全局变量,命名空间不影响生命周期,只是把a隔离开了
namespace data
{
struct Node
{
int val;
struct Node* next;
};
}
}
//cache.h
namespace abc
{
int b = 0;
namespace cache
{
struct Node
{
int val;
struct Node* next;
};
}
}
int main()
{
struct abc::data::Node n1;
n1.val = 1;
struct abc::cache::Node n2;
n2.val = 3;
return 0;
}
它们在不同的文件中,编译器最后会合成同一个命名空间abc中,为了区分两个Node,我们嵌套了一层命名空间。最后通过`::`来创建两个不同类型的结构体变量n1和n2。(这里的`struct abc::data::Node`只是一种类型)
### 2.2 命名空间使用
如果我想简化一下,不想写`abc::`,我该怎么改呢?
//data.h
namespace abc
{
int a = 0;//a还是全局变量,命名空间不影响生命周期,只是把a隔离开了
namespace data
{
struct Node
{
int val;
struct Node* next;
};
}
}
//cache.h
namespace abc
{
int b = 0;
namespace cache
{
struct Node
{
int val;
struct Node* next;
};
}
}
//这里的意思是把abc这个命名空间定义的东西放出来
using namespace abc;
int main()
{
struct data::Node n1;
n1.val = 1;
struct cache::Node n2;
struct cache::Node n3;
struct cache::Node n4;
struct cache::Node n5;
n2.val = 3;
return 0;
}
这里要用`using namespace abc;`这个语句,意思是把abc这个命名空间定义的东西放出来。要按顺序从外到内展开,否则会找不到。另外还能`using namespace abc::data;`这样只展开一部分,只展开abc里的data,不展开abc里的cache。一般我们最好用什么展开什么,以免又引起重名(好不容易搞个命名空间,一放回到解放前)。
是不是很眼熟?还记得hello world吗,那个`using namespace std;`也是这个作用。如果我们不加`using namespace std;`该怎么写?
![img](https://img-blog.csdnimg.cn/img_convert/c5cc270b041f57dd725518a65b1a64b6.png)
![img](https://img-blog.csdnimg.cn/img_convert/5b1b9af8745a2e69317f333ca4745ab4.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
169709)]
[外链图片转存中...(img-Cr21SGGr-1715882169710)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**