C++入门之命名空间
Posted 可乐不解渴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门之命名空间相关的知识,希望对你有一定的参考价值。
命名空间
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace
关键字的出现就是针对这种问题的。
命名空间的定义
定义命名空间,需要使用到
namespace
关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
1.普通的命名空间
//1. 普通的命名空间
namespace Cool // 这里的N为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数,如下:
int val;
int Add(int x, int y)
{
return x + y;
}
}
2.嵌套命名空间
namespace N2
{
int val1;
int val2;
int Add(int x, int y)
{
return x + y;
}
namespace N3
{
int val3;
int val4;
int Sub(int x, int y)
{
return x -y;
}
}
}
3.同名命名空间合并
// 3.同一个工程中允许存在多个相同名称的命名空间, 编译器最后会合成同一个命名空间中。
//这里的命名空间N与1中的命名空间如果在同一个工程中,最后会被编译器合成为同一个命名空间
namespace N
{
int Mul(int x, int y)
{
return x * y;
}
}
示例
命名空间中成员该如何使用呢?比如:
#include<stdio.h>
#include<string.h>
/*
命名冲突
c语言的库里面,有两个函数用scanf和strlen名称
假设我们的代码中想用这两个名称命名变量
*/
namespace cola
{
int scanf = 10;
int strlen = 100;
int Add(int x, int y)
{
return x + y;
}
}
int main()
{
// 默认访问的局部或者全局 先找局部的名称,局部没有再找全局
printf("%x\\n", scanf); // 函数的地址
printf("%x\\n", strlen); // 函数的地址
// 指定访问cola命名空间中的元素
printf("%x\\n", cola::scanf); // a
printf("%x\\n", cola::strlen); // 64
//此时我们想要调用cola中的函数
int ret = cola::Add(1, 2);
std::cout << ret << std::endl; // 3
return 0;
}
此时我们打印的结果如下图所示:
使用标准库的三种方法
在学校学习,有些老师可能会和你说#include<iostream>
与using namespace std;
就是要配套着使用的,这会导致我们错误的认为我们这两个东西就是写c++程序必须要的,其实不然。
C++库为了防止命名冲突,把自己库里面的东西都定义在一个std的命名空间中,我们要使用标准库中的东西,有以下三种方式:
1.指定命名空间—最规范的方式
缺点:这种书写代码会比较麻烦,每个地方要用都要指定命名空间。
如下代码:
#include<iostream>
int main()
{
std::cout << "Hello World_1" << std::endl;
return 0;
}
结果如下:
2.把std整个展开,相当于库里面的东西都到全局域
缺点:这样看起来方便了,但如果我们自己定义的东西与库中的冲突了就没有办法解决了。(规范的工程中不推荐使用该种方式)
如下代码:
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World_2" <<endl;
return 0;
}
结果如下:
3.对部分常用的库中东西进行展开
该方法是针对方法1与方法2的折中方案。(项目中也会经常使用)
如下代码:
#include<iostream>
using std::cout;
using std::endl;
int main()
{
cout << "Hello World_3" << endl;
return 0;
}
结果如下:
面试题
题目:用C++写一个Hello World
你敢相信这是一道腾讯的面试题吗?
有人上手就写出了如下代码
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" <<endl;
return 0;
}
但真的就这么简单吗?如果按上述这种写法有可能你的面试就到此与止了。那么这道题的考察点是什么呢?
其实考察的就是我们命名空间
。
标准写法如下:
#include<iostream>
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
或许你写完上述代码后,面试官可能还会接着深入询问这里的std是什么,为什么要怎么做。
这里就需要大家自行答辩了。
END...
以上是关于C++入门之命名空间的主要内容,如果未能解决你的问题,请参考以下文章