C++命名空间在多文件编程中的具体用法
《C++命名空间》一节讲到,C++ 引入命名空间是为了避免合作开发项目时产生命名冲突,例如:
那么当进行多文件编程时,命名空间又该如何使用呢?一个项目的多个文件中可以使用同一个命名空间吗?接下来就对这些疑问做一一解答。
《C++多文件编程是什么》一节讲到,当进行多文件编程时,通常是将声明部分(例如变量、函数和类等)划分到 .h 文件中,将实现部分划分到 .cpp 文件中。在此基础上,如果要给变量、函数或者类指定命名空间,则该命令空间应至少包含它们的声明部分。所以当进行多文件编程时,命名空间常位于 .h 头文件中。
举个例子,如下是对之前程序做的合理划分:
举个例子:
#include <iostream> namespace Li { //小李的变量定义 class Student { public: void display(){ std::cout << "Li::display" << std::endl; } }; } namespace Han { //小韩的变量定义 class Student { public: void display() { std::cout << "Han::display" << std::endl; } }; } int main() { Li::Student stu1; stu1.display(); Han::Student stu2; stu2.display(); return 0; }程序执行结果为:
Li::display
Han::display
那么当进行多文件编程时,命名空间又该如何使用呢?一个项目的多个文件中可以使用同一个命名空间吗?接下来就对这些疑问做一一解答。
《C++多文件编程是什么》一节讲到,当进行多文件编程时,通常是将声明部分(例如变量、函数和类等)划分到 .h 文件中,将实现部分划分到 .cpp 文件中。在此基础上,如果要给变量、函数或者类指定命名空间,则该命令空间应至少包含它们的声明部分。所以当进行多文件编程时,命名空间常位于 .h 头文件中。
举个例子,如下是对之前程序做的合理划分:
//student_li.h #ifndef _STUDENT_LI_H #define _STUDENT_LI_H namespace Li { //小李的变量定义 class Student { public: void display(); }; } #endif //student_li.cpp #include "student_li.h" #include <iostream> void Li::Student::display() { std::cout << "Li::display" << std::endl; } //student_han.h #ifndef _STUDENT_HAN_H #define _STUDENT_HAN_H namespace Han { //小韩的变量定义 class Student { public: void display(); }; } #endif //student_han.cpp #include "student_han.h" #include <iostream> void Han::Student::display() { std::cout << "han::display" << std::endl; } //main.cpp #include <iostream> #include "student_han.h" #include "student_li.h" int main() { Li::Student stu1; stu1.display(); Han::Student stu2; stu2.display(); return 0; }项目执行结果为:
Li::display
han::display
上面的程序示例中,不同的头文件中使用的是不同的命名空间,除此之外,不同头文件中也可以使用名称相同的命名空间,但前提是位于该命名空间中的成员必须保证互不相同。注意,当类的声明位于指定的命名空间中时,如果要在类的外部实现其成员方法,需同时注明所在命名空间名和类名(例如本项目中的 Li::Student::display() )。
举个例子:
//demo1.h #ifndef _DEMO1_H #define _DEMO1_H #include<iostream> namespace demo { void display() { std::cout << "demo1::display" << std::endl; } int num=20; } #endif //demo2.h #ifndef _DEMO2_H #define _DEMO2_H #include <iostream> namespace demo { void display(int a) { std::cout << "demo2::display" << std::endl; } //int num; 因为 demo1.h 中已经声明有同名的变量,取消注释会造成重定义错误 } #endif //main.cpp #include <iostream> #include "demo1.h" #include "demo2.h" int main() { demo::display(); demo::display(2); std::cout << demo::num << std::endl; return 0; }项目执行结果为:
demo1::display
demo2::display
20
可以看到,demo1.h 和 demo2.h 文件中都定义有 demo 命名空间,当这 2 个头文件被引入到 main.cpp 文件中时,意味着 demo 空间中同时包含 display()、display(int n) 以及 num 这 3 个成员。也就是说,分散在不同文件中的同名命名空间会合并为一个。注意,本例中 display() 函数的实现也位于 .h 文件中,仅仅是为了演示方便,读者可自行将该函数的声明和定义进行合理划分。
再次强调,虽然同一项目的不同文件中可以定义相同的命名空间,但必须保证空间中的成员互不相同,否则编译器会报“重定义”错误。注意,这里的 display() 和 display(int n) 并不会造成重定义,它们互为重载函数。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算