C++类包含编译模型实战

发布时间:2024年01月20日

一、实战概述

  • 本实战通过实例详细阐述了C++中类的包含编译模型,首先以普通类Student为例,展示如何在头文件(student.h)中声明类和成员函数,在单独的源文件(student.cpp)中实现成员函数,然后在主程序(main.cpp)中通过包含头文件并创建对象来调用成员函数。这一过程体现了C++的模块化编程思想:接口与实现分离,便于代码维护和复用。

  • 接着,进一步探讨了C++模板类的包含编译模型,通过创建模板类Base<T>展示了模板类特有的编译机制。由于模板类在编译时期需要根据传入的实际类型生成代码,因此其定义和实现通常在同一头文件中进行。在main.cpp中,我们使用Base<int>Base<double>Base<string>实例化模板类,并观察到编译器自动为每种类型生成相应的add()函数实现,成功输出不同类型参数计算的结果。

  • 总结来说,本实战概述着重于演示C++中两种不同的类组织方式及其对应的编译模型,有助于读者理解和掌握C++项目开发中的代码组织结构和编译流程。

二、实战步骤

(一)C++普通类的包含编译模型

1、创建普通类定义文件

  • 定义了一个名为Student的普通类,它在头文件student.h中声明了成员函数print()
    在这里插入图片描述
class Student {
public:
    void print();
};

#include "student.cpp"

2、创建普通类实现文件

  • student.cpp文件中实现了该成员函数
    在这里插入图片描述
void Student::print()
{
    cout << "学号:20230101" << endl;
    cout << "姓名:陈燕文" << endl;
    cout << "性别:女" << endl;
    cout << "年龄:18" << endl;
    cout << "专业:软件技术" << endl;
    cout << "班级:2023软件1班" << endl;
    cout << "电话:158909094567" << endl;
}

3、创建主程序文件

  • 主程序main.cpp通过包含头文件,并创建Student对象调用print()方法输出信息。
    在这里插入图片描述
#include <iostream>
using namespace std;
#include "student.h"

int main()
{
    Student student;
    student.print();
    
    return 0;
}
  • 这个过程遵循C++的编译模型:头文件包含了类的声明(接口),源文件包含了类成员函数的具体实现。当主程序main.cpp编译时,编译器会先编译student.cpp生成对应的OBJ文件,再编译main.cpp时,由于包含了student.h,所以知道Student类的存在及其方法签名。最后链接阶段将所有OBJ文件合并成可执行文件,完成整个程序的构建。

4、运行主程序,查看结果

  • 运行主程序,输出学生信息
    在这里插入图片描述

(二)C++模板类的包含编译模型

1、创建模板类定义文件

  • base.h中,我们定义了一个模板类Base<T>,其中有一个泛型方法add(T x, T y)。这里需要注意的是,模板类的实现不能像普通类那样分离到单独的.cpp文件中,因为模板类在编译时期需要根据传入的实际类型生成具体的代码。
    在这里插入图片描述
template<class T> 
class Base  
{  
public:  
  Base() {};  
  ~Base() {};  
  T add(T x, T y);  
};

#include "base.cpp"

2、创建模板类实现文件

  • base.h文件中紧随模板类定义之后,我们直接给出了add()方法的实现。这是因为编译器在遇到模板类的使用时,才会进行实例化并生成实际的函数代码。
    在这里插入图片描述
template<class T> 
T Base<T>::add(T x, T y)  
{  
    return x + y;  
}  

3、创建主程序文件

  • main.cpp中,当我们声明Base<int>Base<double>Base<string>时,编译器会根据给定的模板参数生成不同的add()函数实现。
    在这里插入图片描述
#include <iostream>
using namespace std;
#include "string"
#include "base.h"

int main()
{
    Base<int> base1;  
    cout << "2 + 3 = " << base1.add(2, 3) << endl;  
    
    Base<double> base2;
    cout << "1.3 + 3.4 = " << base2.add(1.3, 3.4) << endl;
    
    Base<string> base3;
    cout << "inter + national = " << base3.add("inter", "national") << endl; 
    
    return 0;
}

4、运行主程序,查看结果

  • 运行main.cpp程序,可以看到不同类型参数下的add()方法正确计算结果并输出:“2 + 3 = 5”、“1.3 + 3.4 = 4.7"以及"inter + national = international”。
    在这里插入图片描述

三、实战总结

  • 本实战通过实例演示了C++普通类与模板类的编译模型:普通类实现接口与功能分离,编译时链接合并;模板类则在编译时期根据传入类型生成具体代码,定义与实现常置于同一头文件中。通过创建、编译和运行包含普通类Student及模板类Base<T>的程序,直观展示了模块化编程和模板机制的应用实践。
文章来源:https://blog.csdn.net/howard2005/article/details/135713040
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。