第三点 :命名空间可以嵌套命名空间
说明 :面对不同场景,需要嵌套多层命名空间起到隔离的效果。
具体场景 :现在A公司有一堆重要数据,A公司用命名空间将这些数据圈起来。A公司里面有两个程序员B和C。B程序员做了个Push函数实现压栈的功能,而C程序员做了Push函数实现插入元素的功能,在A公司所定义的命名空间,出现名称冲突的问题,对此需要B和C程序员定义自己的命名空间存放自己的数据。这里就需要命名空间的嵌套。
# include
using namespace std;
namespace A_company
{
namespace B_epe
{
Push ( ) ;
}
namespace C_epe
{
Push ( ) ;
}
}
使用方式: cout<< A:: B_epe:: 内容<< endl;
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
第四点 :同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
namespace N
{
int a;
int d;
}
namespace N
{
int a= 1 ;
int Add ( int x, int y)
{
return x+ y;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">
说明 :这里重定义不是指命名空间名称冲突,而是当相同名称的命名空间合并同一个命名空间中,变量a名称冲突导致。
四、编译器搜索原则
不指定域 :1.当前局部域 2.全局域指定域 :如果指定域,直接去指定域搜索(优先去域中搜索,比如std::cout)::
是域作用限定符(优先向全局范围搜索)
int x= 10 ;
int main ( )
{
int x= 1 ;
printf ( "%d\n" , x) ;
printf ( "%d\n" , :: x)
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
五、命名空间三种使用方式
namespace N
{
int a= 1 ;
int b= 0 ;
int Add ( int x, int y) { return x+ y; }
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
第一种 :加命名空间名称及作用域限定符
int main ( )
{
printf ( "%d\n" , N:: a)
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
第二种 :使用using将命名空间中某个成员引入(打开某个成员权限)
将N命名空间中变量b的权限打开
using N:: b;
int main ( )
{
printf ( "%d\n" , b) ;
printf ( "%d\n" , N:: a)
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
第三种 :使用using namespace
命名空名称引入
将N命名空间展开(跟头文件的展开是不同的,就像李大爷说你可以来我家菜园顺便采菜)
using namespce N;
int main ( )
{
printf ( "%d\n" , N:: a) ;
printf ( "%d\n" , b) ;
Add ( 10 , 20 ) ;
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
关于上面三种方式,在日常练习或竞赛中更加推荐使用第三种更为简便方式,而对于在工作中更加推荐使用上面两种方式,使得程序更具有安全性。
六、简单了解:C++输入与输出
# include
using namespace std;
int main ( )
{
cout<< "Helloc world" << endl;
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
使用cout
标准输出对象(控制台)和cin
标准输入对象时,必循包含头文件以及按照命名空间使用方式使用std cout
和cin
是全局的流对象,endl
是特殊的C++符号,表示换行输出,他们都包含在包含头文件中使用C++输入输出更加方便,不需要像printf/scanf
输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型 实际上cout
和cin
分别时ostream
和instream
类型的对象,>>和<<也涉及运算符重载等知识。 这里只需要简单学习他们的使用就行,后面还有不断深入学习
关于第三点与第四点 :
# include
using namespace std;
int main ( )
{
<< :可以表示左移或者流插入( 自动识别类型)
int i= 10 ; char p= 'a' ;
i= i<< 1 ;
cout<< i<< p<< endl;
>> : 可以表示右移或者流提取( 自动识别类型)
int a= 0 ;
cin>> a;
关于自动识别类型的功能: 关于精度打印可以使用printf函数
比如: double d= 1.11111 ;
printf ( "%.2lf\n" , d) ;
cout<< d<< endl;
对此显然时printf更加胜任这些操作,当然可以根据不同场景选择输入即可。
return 0 ;
}
其中关于cout和cin还有很多更加复杂的用法,这里就不展开学习
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
早期标准库将所有功能在全局域中是实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C语言中头文件区分,也为了正确使用命名空间,规定C++头文件不带.h.旧编译器(vc6.0)
中还支持
格式,后续编译器已不支持,因此推荐使用+std的方式
六、std命名空间的使用惯例
std是C+标准库的命名空间,如何展开std使用更加合理呢?
在日常练习中,建议直接使用using namespace std
即可,这样就很方便。
using namespace std展开,标准库就全部暴露出来了 ,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多,规模大,就很容易出现。所以建议在项目开发中使用,向std::cout
这样使用时指定命名空间和using std::cout
展开常用的库对象/类型等方式。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻: 以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二呀C++笔记,希望对你在学习C++语言旅途中有所帮助!
data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/2302_79177254/article/details/140668996","extend1":"pc","ab":"new"}">>
评论记录:
回复评论: