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

news2025/1/19 7:52:34

文章目录

  • 一、实战概述
  • 二、实战步骤
    • (一)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.coloradmin.cn/o/1398254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后&#xff0c;Unity报错&#xff1a;显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

Leetcode 用队列实现栈

题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…

中使用 MOOTDX库读取通达信的数据,WIN+PYTHON,最新问题排查

M项目概述 - MOOTDXhttps://www.mootdx.com/zh-cn/latest/帮助文档https://www.mootdx.com/zh-cn/latest/​​​​​​​​​​​​​​​​​​​​​ 库的安装 注&#xff1a;我这的安装过程必须要ROOT权限&#xff0c;所以我用管理员的权限运行了控制台 pip install moot…

OCR识别网络CRNN理解与Pytorch实现

CRNN是2015年的论文“An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition”提出的图像字符识别网络&#xff0c;也是目前工业界使用较为广泛的一个OCR网络。论文地址&#xff1a;https://arxiv.org/…

SCI好看的配图-汇总

文章目录 图源&#xff1a;Sustainable Cities and Society【期刊】条形图2热力图-地图 图源&#xff1a;Sustainable Cities and Society【期刊】 引自&#xff1a;A machine learning-driven spatio-temporal vulnerability appraisal based on socio-economic data for COV…

【Vue】使用 Vuex 作为状态管理

【Vue】使用 Vuex 作为状态管理 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它使用单一状态树&#xff0c;这意味着这个对象包含了全部的应用层级状态&#xff0c;并且以一种相对集中的方式存在。这也意味着&#xff0c;通常单个项目中只有一个 Vuex store。Vue…

AI大模型开发架构设计(2)——AI绘画技术架构应用实践

文章目录 1 AI绘画整体流程2 AI绘画技术架构文生图核心算法原理文生图工程架构 3 AI绘画的应用实践 1 AI绘画整体流程 第一步&#xff1a;输入 Prompt 提示词&#xff1a;/mj 提示词第二步&#xff1a;文生图(Text-to-Image)构图第三步&#xff1a;图片渲染第四步&#xff1a;…

代码里下毒了,支付下单居然没加幂等

又是一个风和日丽没好的一天&#xff0c;小猫戴着耳机&#xff0c;安逸地听着音乐&#xff0c;撸着代码&#xff0c;这种没有会议的日子真的是巴适得板。 不料祸从天降&#xff0c;组长火急火燎地跑过来找到了小猫。“快排查一下&#xff0c;目前有A公司用户反馈积分被多扣了”…

【咕咕送书 | 第八期】羡慕同学进了大厂核心部门,看懂这本书你也能行!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

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

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

实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令

本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站&#xff0c;通过信息收集插件wappalyzer&#xff0c;发现ZABBIX-监控系统&#xff1a; 使用谷歌搜索历史漏洞&#xff1a;zabbix漏洞 通过目录扫描扫描到后台&#xff0c;谷歌搜索一下有没有默认弱口令 成功进去了…

nginx配置内网代理,前端+后端分开配置

安装好后nginx&#xff0c;进入配置文件 我这块安装在了home里面&#xff0c;各位根据自身情况选择 打开nginx.conf文件 在底部查看是否包含这段信息&#xff1a;含义是配置文件包含该路径下的配置文件 include /home/nginx/conf/conf.d/*.conf; # 该路径根据自己的安装位置…

【从0到1学Python】第二讲:Python中的各种“量”(一)

也许你知道学习一门语言的第一件事就是在屏幕上输出"Hello world!"。 但是请别着急&#xff01;在本系列文章中&#xff0c;我希望在讲如何输出之前&#xff0c;先谈谈Python中的各种量。因为&#xff0c;输出、输入语句也是基于各种“量”来完成的。我想&#xff0c…

基于springboot+vue的宠物领养系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景及意…

Three.JS教程1 环境搭建、场景与相机

Three.JS教程1 环境搭建、场景与相机 一、Three.JS简介二、环境搭建1. 开发准备2. 安装 three.js3. 新建文件index.htmlmain.js 4. 关于附加组件5. 启动 三、创建场景1. 场景的概念2. 相机的概念3. 相机的几个相关概念&#xff08;1&#xff09;视点&#xff08;Position&#…

【机器学习】四大类监督学习_模型选择与模型原理和场景应用_第03课

监督学习中模型选择原理及场景应用 监督学习应用场景 文本分类场景&#xff1a; o 邮件过滤&#xff1a;训练模型识别垃圾邮件和非垃圾邮件。 o 情感分析&#xff1a;根据评论或社交媒体内容的情感倾向将其分类为正面、负面或中性评价。 o 新闻分类&#xff1a;将新闻文章自动…

第一篇【传奇开心果】Vant 开发移动应用:从helloworld开始

传奇开心果系列博文 博文系列目录Vant of Vue 开发移动应用示例博文目录一、从helloworld开始二、添加几个常用组件三、添加组件事件处理四、添加页面和跳转切换路由五、归纳总结知识点六、知识点示例代码 博文系列目录 Vant of Vue 开发移动应用示例 博文目录 一、从hellow…

二、简单控件

二、简单控件 #mermaid-svg-TR8KwIeb54zOjfmt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TR8KwIeb54zOjfmt .error-icon{fill:#552222;}#mermaid-svg-TR8KwIeb54zOjfmt .error-text{fill:#552222;stroke:#55222…

45 mount 文件系统

前言 在 linux 中常见的文件系统 有很多, 如下 基于磁盘的文件系统, ext2, ext3, ext4, xfs, btrfs, jfs, ntfs 内存文件系统, procfs, sysfs, tmpfs, squashfs, debugfs 闪存文件系统, ubifs, jffs2, yaffs 文件系统这一套体系在 linux 有一层 vfs 抽象, 用户程序不用…

1.php开发-个人博客项目文章功能显示数据库操作数据接收

&#xff08;2022-day12&#xff09; #知识点 1-php入门&#xff0c;语法&#xff0c;提交 2-mysql 3-HTMLcss ​ 演示案例 博客-文章阅读功能初步实现 实现功能&#xff1a; 前端文章导航&#xff0c;点入内容显示&#xff0c;更改ID显示不同内容 实现步骤&#xff1…