C++命名空间在多文件编程中的具体用法

C++命名空间在多文件编程中的具体用法,第1张

概述《 C++命名空间 》一节讲到,C++ 引入命名空间是为了避免合作开发项目时产生命名冲突,例如: #include iostreamnamespace Li { //小李的变量定义 class Student { public: void display(){ std::cout Li::disp 《C++命名空间》一节讲到,C++ 引入命名空间是为了避免合作开发项目时产生命名冲突,例如:
#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

如上所示,小李与小韩各自定义了以自己姓氏为名的命名空间,此时再将他们各自定义的 Student 类放在一起编译就不会有任何问题。

那么当进行多文件编程时,命名空间又该如何使用呢?一个项目的多个文件中可以使用同一个命名空间吗?接下来就对这些疑问做一一解答。

《C++多文件编程是什么》一节讲到,当进行多文件编程时,通常是将声明部分(例如变量、函数和类等)划分到 .h 文件中,将实现部分划分到 .cpp 文件中。在此基础上,如果要给变量、函数或者类指定命名空间,则该命令空间应至少包含它们的声明部分。所以当进行多文件编程时,命名空间常位于 .h 头文件中。

举个例子,如下是对之前程序做的合理划分:
//student_li.h#ifndef _STUDENT_li_H#define _STUDENT_li_Hnamespace 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_Hnamespace 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

注意,本例中 display() 函数的实现也位于 .h 文件中,仅仅是为了演示方便,读者可自行将该函数的声明和定义进行合理划分。

可以看到,demo1.h 和 demo2.h 文件中都定义有 demo 命名空间,当这 2 个头文件被引入到 main.cpp 文件中时,意味着 demo 空间中同时包含 display()、display(int n) 以及 num 这 3 个成员。也就是说,分散在不同文件中的同名命名空间会合并为一个。

再次强调,虽然同一项目的不同文件中可以定义相同的命名空间,但必须保证空间中的成员互不相同,否则编译器会报“重定义”错误。注意,这里的 display() 和 display(int n) 并不会造成重定义,它们互为重载函数。

总结

以上是内存溢出为你收集整理的C++命名空间在多文件编程中的具体用法全部内容,希望文章能够帮你解决C++命名空间在多文件编程中的具体用法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1231108.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存