ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-07-12 16:37:51  阅读:294  来源: 互联网

标签:文件 编程 C++ 用法 空间 Student 命名 include display


《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_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

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

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

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

 

标签:文件,编程,C++,用法,空间,Student,命名,include,display
来源: https://www.cnblogs.com/zjuhaohaoxuexi/p/16470576.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有