C++第二篇:命名空间(namespace)
在C语言中,定义变量的时候,全局变量名并不能相同,不然就会报错。但是在C++中,有了命名空间的存在,就可以避免这个问题。我们可以将它想像成一个班级,一班的李华和二班的李华名字都叫李华,但是一个是一班的,一个二班的,并不会混淆。所以命名空间的核心作用避免命名重复,使得代码模块化。
在命名空间中,可以定义变量、函数、类和结构体等。来看下面的示例:
#include <iostream>
#include <string>
//定义命名空间SpaceA
namespace SpaceA {int num = 10;struct student{std::string name;int age;};
}
//定义命名空间SpaceB
namespace SpaceB {int num = 20;
}//using SpaceA::num;
//注意点:上面的注释的操作是将命名空间的变量引出,这样写法容易引发歧义,
//如果此时还有一个全局变量为num,编译器就不知道该
//指向哪个的num,从而引发歧义。//using namespace SpaceA;
//使用这样的写法,可以使用命名空间成员,无需在变量前面xxx::
//但这样的写法会有代码的冗余,同时这样的写法也会导致歧义;
//实际上用到哪个变量就在前面加上xxx::,更加规范。int main()
{ struct SpaceA::student stu;stu.age = 18;stu.name="lihua";//相同的变量名在不同的命名空间互不影响std::cout << SpaceA::num << std::endl;std::cout << SpaceB::num << std::endl;std::cout << stu.age << std::endl;std::cout << stu.name << std::endl;return 0;
}
结果如图:
可以看到,在这段代码中,有两个命名空间,具有相同的变量num,但并不影响,同时在命名空间中环定义了一个结构体。这说明了命名空间确实可以让代码的命名变得更加灵活。
需要记住的是:外部(其他文件.c.h)调用该命名空间时,变量是需要再声明时加上extern 关键词修饰,函数则不需要,因为函数是默认可以被调用的。
通过这段代码,相信大家命名空间有了一定的理解,那么还剩下::和<<运算符我们再来了解一下:
- ::实际上是用来访问成员的,比如上面代码中使用::来访问了SpaceA中的结构体中的一个变量。
SpaceA::num
- << 实际上是一个运算符,作用是将数据插入到输出流,但在与int,float等数据结合,就还是左移运算符。
重点:再看上面的代码,实际上我们会发现,string这样的的一个类型,并且我们可以直接对变量进行字符串赋值。很出人意料!在C中,我们通常是使用strcpy()函数将一个字符串拷贝到一块地址,但C++却可以直接赋值。实际上,这里牵扯到了C和C++的一个区别,就是C++是面向对象的,而C是面向过程的。string 实际上就是一个对象,而对直接赋值字符串就是这个对象的特有的功能。至于什么是对象,后面会讲到。