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

文章目录

  • 一、实战概述
  • 二、实战步骤
    • (一)C++普通类的包含编译模型
      • 1、创建普通类定义文件
      • 2、创建普通类实现文件
      • 3、创建主程序文件
      • 4、运行主程序,查看结果
    • (二)C++模板类的包含编译模型
      • 1、创建模板类定义文件
      • 2、创建模板类实现文件
      • 3、创建主程序文件
      • 4、运行主程序,查看结果
  • 三、实战总结

一、实战概述

  • 本实战通过实例详细阐述了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>的程序,直观展示了模块化编程和模板机制的应用实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417348.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、简介二、成员函数三、使用示例四、C模拟实现五、std::shared_ptr的线程安全问题六、总结温馨提示 引言 在 C 动态内存管理中&#xff0c;除了 auto_ptr 和 unique_ptr 之外&#xff0c;还有一种智能指针 shared_ptr&#xff0c;它可以让多个指针共享同一个动…

伊恩·斯图尔特《改变世界的17个方程》傅里叶变换笔记

主要是课堂的补充&#xff08;yysy&#xff0c;我觉得课堂的教育模式真有够无聊的&#xff0c;PPT、写作业、考试&#xff0c;感受不到知识的魅力。 它告诉我们什么&#xff1f; 空间和时间中的任何模式都可以被看作不同频率的正弦模式的叠加。 为什么重要&#xff1f; 频率分量…

投标文件-优化--word快捷键设置

大纲导航快捷键的设置 “导航窗格”功能是指的如上图所示的功能&#xff0c;在写标书的时候&#xff0c;时刻需要关注你的目录大纲级别是否设置正确&#xff0c;文章层级目录是否正确&#xff0c;每次都是需要“视图--导航窗格”点&#xff0c;把人烦的不行&#xff0c;如何优化…

WordPress怎么去除jquery和CSS静态文件链接中的版本号?附2种方法

我们很多WordPress网站默认情况下所加载的jquery和CSS静态文件链接中都会带有相应的版本号&#xff0c;比如boke112百科使用的YIA主题&#xff0c;加载CSS文件时就会在链接地址后面加上?ver2.7&#xff0c;即是style.css?ver2.7 除了CSS文件会加上版本号外&#xff0c;加载主…

含并行连结的网络(GoogLeNet)

目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽&#xff0c;只改变通道数。GoogLeNet也大量使用1*1卷积&#xff0c;把它当作全连接用。 V3耗内存比较多&#xff0c;计算比较慢&#xff0c;但是精度比较准确。 2.代码 import torch from torch import nn from t…

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在将一个复杂对象的创建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示形式。 主要角色&#xff1a; 产品&#xff08;Product&#xff09;&#xff1a;表示正在构建…

vue2+webpack升级vue3+vite,报错Cannot read properties of null (reading ‘isCE‘)

同学们可以私信我加入学习群&#xff01; 正文开始 前言问题分析解决总结 前言 系列文章&#xff1a;vue2webpack升级vue3vite&#xff0c;修改插件兼容性bug 前面的文章主要是介绍&#xff0c;在升级初始阶段遇到的一些显而易见的兼容性问题和bug。随着项目迭代的不断深入&a…

从数据角度分析年龄与NBA球员赛场表现的关系【数据分析项目分享】

好久不见朋友们&#xff0c;今天给大家分享一个我自己很感兴趣的话题分析——NBA球员表现跟年龄关系到底大不大&#xff1f;数据来源于Kaggle&#xff0c;感兴趣的朋友可以点赞评论留言&#xff0c;我会将数据同代码一起发送给你。 目录 NBA球员表现的探索性数据分析导入Python…

mysql中的联合索引为什么要遵循最佳左前缀法则?

mysql中的联合索引为什么要遵循最佳左前缀法则&#xff1f; 一、什么是联合索引二、联合索引的优化1.常规的写法&#xff08;回表查询&#xff09;2.优化写法&#xff08;索引覆盖&#xff09; 三、 为什么要遵循最佳左前缀法则&#xff1f;1.如下查询语句可以使用到索引&#…

100天精通鸿蒙从入门到跳槽——第8天:TypeScript 知识储备:泛型

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

k8s---配置资源管理

目录 配置资源管理的方式 secret pod如何来引用secret&#xff1f;&#xff1f;&#xff1f; 陈述式创建&#xff1a; 声明式创建 Secret创建加密文件 使用token挂载 环境变量使用 docker-registry ConfigMap 陈述式 热更新 总结&#xff1a; 配置资源管理的方式 …

开发知识点-JAVA-springboot

springboot springbootConfiguration注解的底层核心原理Bean注解的底层核心原理 springboot Configuration注解的底层核心原理 https://www.bilibili.com/video/BV1rq4y1E7gK/?spm_id_from333.999.0.0&vd_sourcef21773b7086456ae21a58a6cc59023be spring.io 全家桶 24…