从今天正式开始对C++的学习,这里只学习C++对C的拓展,和C相同的部分在C语言专栏中都可以找到,我们先看一段C++代码
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world<<endl;
return 0;
}
同样也是打印hello world,头文件还有main函数之前的using namespace std什么意思,cout又是什么意思,都需要我们进行了解
1.命名空间基础
当一个项目很大时,它可能会包含大量重复的名字,C++可以对名字的产生和其所在作用域进行控制,在之前C语言的学习我们可以通过static关键字来使得名字只能在本编译单元内可见,在C++中我们可以通过命名空间来控制对名字的访问
在C++中,名称可以是符号常量、变量、宏、函数、结构体、枚举等等
std是C++标准命名空间,C++标准程序库中的所有标识符都被定义在std命名空间中,比如类iostream、vector等,使用时要加上using声明(using namespace std)或using指示(如std::cout)。
可以定义不同的命名空间,这样即使名字相同也不会出现错误,类似这样:
那我们如何定义命名空间呢,下面就是了
2.命名空间的使用
2.1 命名空间的定义
namespace 名称
{
//定义变量、函数、类型等等
}
2.2 命名空间成员的访问
(1)使用作用域操作符 ::
(2)空间名::成员
#include<iostream>
using namespace std;
namespace nameA //定义一个名字是nameA的空间
{
int a;
void func()
{
cout<<"nameA"<<endl;
}
}
namespace nameB //定义一个名字是nameB的空间
{
int a;
void func()
{
cout<<"nameB"<<endl;
}
}
int main()
{
//访问空间中的成员变量
nameA::a=100;
nameB::a=200;
cout<<"A::a:"<<nameA::a<<endl;//cout就类似printf,用来输出内容,endl的作用就相当于\n
cout<<"B::a:"<<nameB::a<<endl;
//访问空间中的成员函数
nameA::func();
nameB::func();
return 0;
}
由此可见,在不同的命名空间中定义相同名字的变量或者函数都是没有问题的,两个空间相互独立,谁也不会影响谁,这就是C++的优势!
2.3 命名空间的错误使用
命名空间不能在某个函数内定义,比如这样:
void test()
{
namespace A
{
int a=10;
}
namespace B
{
int a=10;
}
cout<<A::a<<endl;
cout<<B::a<<endl;
}
命名空间只能在全局范围内定义,否则你函数调用结束了,空间也没了,等于没定义,费这么大劲干嘛,只能在全局范围内定义!
2.4 命名空间的嵌套使用
namespace A
{
int a=10;
namespace B
{
int a=10;
}
}
void test()
{
cout<<A::a<<endl;
cout<<A::B::a<<endl;
}
2.5 命名空间的别名
如果命名空间的名字很长记不住怎么办,我们有办法,起个别名,代码如下:
namespace veryLongname
{
int a=10;
void func()
{
cout<<"hello world"<<endl;
}
void test()
{
namespace shortname=veryLongname;//起别名
cout<<"veryLongname::a:"<<shortname::a<<endl;
veryLongname::func();
shortname::func();
}
可以看到,两个名字的效果是一样的,神奇不神奇?