本实战通过实例详细阐述了C++中类的包含编译模型,首先以普通类Student
为例,展示如何在头文件(student.h)中声明类和成员函数,在单独的源文件(student.cpp)中实现成员函数,然后在主程序(main.cpp)中通过包含头文件并创建对象来调用成员函数。这一过程体现了C++的模块化编程思想:接口与实现分离,便于代码维护和复用。
接着,进一步探讨了C++模板类的包含编译模型,通过创建模板类Base<T>
展示了模板类特有的编译机制。由于模板类在编译时期需要根据传入的实际类型生成代码,因此其定义和实现通常在同一头文件中进行。在main.cpp
中,我们使用Base<int>
、Base<double>
和Base<string>
实例化模板类,并观察到编译器自动为每种类型生成相应的add()
函数实现,成功输出不同类型参数计算的结果。
总结来说,本实战概述着重于演示C++中两种不同的类组织方式及其对应的编译模型,有助于读者理解和掌握C++项目开发中的代码组织结构和编译流程。
Student
的普通类,它在头文件student.h
中声明了成员函数print()
class Student {
public:
void print();
};
#include "student.cpp"
student.cpp
文件中实现了该成员函数void Student::print()
{
cout << "学号:20230101" << endl;
cout << "姓名:陈燕文" << endl;
cout << "性别:女" << endl;
cout << "年龄:18" << endl;
cout << "专业:软件技术" << endl;
cout << "班级:2023软件1班" << endl;
cout << "电话:158909094567" << endl;
}
main.cpp
通过包含头文件,并创建Student
对象调用print()
方法输出信息。#include <iostream>
using namespace std;
#include "student.h"
int main()
{
Student student;
student.print();
return 0;
}
main.cpp
编译时,编译器会先编译student.cpp
生成对应的OBJ文件,再编译main.cpp
时,由于包含了student.h
,所以知道Student
类的存在及其方法签名。最后链接阶段将所有OBJ文件合并成可执行文件,完成整个程序的构建。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"
base.h
文件中紧随模板类定义之后,我们直接给出了add()
方法的实现。这是因为编译器在遇到模板类的使用时,才会进行实例化并生成实际的函数代码。template<class T>
T Base<T>::add(T x, T y)
{
return x + y;
}
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;
}
main.cpp
程序,可以看到不同类型参数下的add()
方法正确计算结果并输出:“2 + 3 = 5”、“1.3 + 3.4 = 4.7"以及"inter + national = international”。Student
及模板类Base<T>
的程序,直观展示了模块化编程和模板机制的应用实践。