如有错误欢迎指正
文章目录
前言
命名空间是c++为了解决c语言命名冲突问题诞生的
举个栗子:
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”
我们不可能记住所有的函数名字,而且以后在项目中自己和同伴也有可能定义相同名字的变量或函数,总不能打一架来决定命名权吧,所有来看看命名空间是怎么解决这个问题的吧。
一、命名空间定义
又一个栗子:namespace yao //名字自定义
{
int a = 1;
}
注意:一个命名空间就定义了一个新的域
说到域,其实我们之前学c的时候就接触过——作用域,作用域包括局部域和全局域,作用域就是域的一种,还有类域等。
下面通过一个简单的示例看看命名空间域和局部域,全局域
#include<stdio.h>
int a = 0;//全局变量
int main()
{
int a = 2;//局部变量
printf("%d\n", a);
return 0;
}猜猜这个代码运行的结果是什么?
答案是2--这是因为编译时默认是先在局部域里找,再去全局域里找
思考一下:要是想跳过局部域,直接在全局域中找呢?
看看这个示例吧
#include<stdio.h>
int a = 0;
namespace yao
{
int a = 1;
}int main()
{
int a = 2;
printf("%d\n", a);
printf("%d\n", ::a);
printf("%d\n", yao::a);return 0;
}这段代码呢?
答案是2,0,1
::——域作用限定符
printf("%d\n", ::a); //::左边是空格(空格可省)代表是全局域,如果左边有命名空间域的名字 则在此域中查找
这样便解决了命名冲突的问题!!
另外:
1.命名空间可以定义任何东西,如变量,函数,类型,也可以嵌套。
2.多个同名的命名空间会被合并:举个例子,你在不同的头文件里定义了两个命名空间,如果这两 个命名空间是同一个名字那么,这两个命名空间会被合并,如果命名空间里有名字相同则会报 错。解决同一个命名空间里同名问题是嵌套
现在还记得开头的栗子吗?
知道该怎么修改了吗?
#include <stdio.h>
#include <stdlib.h>
namespace yao
{
int rand =1;
}
int main()
{
printf(“%d",yao::rand);
printf("%p",rand);
return 0;
}
运行一下看看结果吧!
二.命名空间使用
上面说到默认查找顺序是局部域->全局域,那么在加上命名空间域的顺序是什么呢?
其实默认情况下是不会到命名空间域里搜索的。
想要去命名空间域中查找,两种可能:
1展开了命名空间域如 using namespace yao;
2指定访问命名空间域如 printf(“%d",yao::rand);
方法一:namespace yao{int a = 1;}using namespce yao ;int main (){printf ( "%d\n" , yao::a );return 0 ;}这种方法可以但不建议,一般不要随意展开命名空间域,尤其是在项目中,千万不要日常练习可以这么写,方便
方法二:
namespace yao{int a = 1;}int main (){printf ( "%d\n" , yao::a );return 0 ;}这种方法赞成,在以后的项目中最好使用这种
使用using将命名空间中某个成员引入
这是比较适中的方法,如果某个命名空间域里的某个成员用的非常多且不容易冲突可以这样写
namespace yao{int a = 1;}using yao::a ;int main (){printf ( "%d\n" , yao::a );return 0 ;}
三.简单介绍一下c++中的输入输出
#include<iostream>// std 是 C++ 标准库的命名空间名, C++ 将标准库的定义实现都放到这个命名空间中using namespace std ;//日常练习中可以直接展开int main (){cout << "Hello world!!!" << endl ;return 0 ;}//项目中为了避免冲突还是使用方法二#include<iostream>int main (){std::cout << "Hello world!!!" <<std:: endl ;return 0 ;}
<<——流插入运算符
输入
Cout<<"hello"<<endl //<<endl等价于\n
Cout 的特点是自动识别类型
>>——流提取运算符
输出
Cin>>
四.一些零碎知识
1.c++兼容c,所有c和c++可以混着用,哪个方便用哪个
2.大量输出输出时c比c++快,因为c++需要先兼容和同步c,当然c++也是可以快的,可以关闭 c++的同步
3.为什么c++头文件没有.h
其实之前是#include<iostream.h>//很老的编译器 vc6.0还是这样,当时没有命名空间
#include<iostream>//命名空间出来后为了区分就把.h去掉了,其次也是为了不和c冲突
4.std是c++标准库包含stl
5.展开命名空间和include包含头文件没有关联
展开命名空间域指编译时是否去命名空间中搜索,而不是将命名空间展开
包含头文件指在预处理阶段将头文件展开
展开命名空间只是告诉你要去命名空间域里搜索,但要是没有头文件它就找不到
总结
以上就是c++命名空间域的知识,还有一点点输入输出。