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

news2024/11/15 23:34:55

文章目录

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

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

相关文章

【Leetcode 144.二叉树的前序遍历】将二叉树每个节点的值以前序遍历的顺序存入数组中

int* preorderTraversal( struct TreeNode*root, int* returnSize) { }解答代码&#xff1a; int TreeSize(struct TreeNode*root){return rootNULL?0:TreeSize(root->left)TreeSize(root->right)1;}void Prevorder(struct TreeNode*root,int*a,int*pi){if(rootNULL)re…

内网穿透的应用-如何使用Docker部署Redis数据库并结合内网穿透工具实现公网远程访问

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…

代码随想录算法训练DAY25|回溯2

算法训练DAY25|回溯2 216.组合总和III 力扣题目链接 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n …

【并发编程】synchornized原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 目录 Monitor概念 Java对象头 普通对象 数组对象 Monitor(锁) Monitor结构如下&#xff1a; 注意&#xff1a; 原理之synchornized 轻量…

压力容器多开孔结构静力分析APP

压力容器多开孔结构静力分析APP对带有多个接管的容器结构在内压作用下进行静力分析&#xff0c;考察相邻接管开孔对容器及接管强度的影响。通过对容器和接管的几何尺寸、材料属性、载荷等进行参数化&#xff0c;以方便设计工程师对不同参数下的此类结构进行仿真分析。 近年来&a…

透明拼接屏方案,从底层设计到应用尽情了解

一、引言 随着科技的飞速发展&#xff0c;显示技术也在不断创新。透明拼接屏方案作为一种新型的显示技术&#xff0c;以其独特的透明设计和灵活的拼接特性&#xff0c;在商业展示、广告、建筑等领域得到广泛应用。本文将深入探讨透明拼接屏方案的设计、实现方式、技术逻辑、应…

STM32之RTC实时时钟

一、实时时钟概述 1、实时时钟介绍 英文缩写&#xff1a;RTC。显示年、月、日、时、分、秒、星期,自动计算闰年&#xff0c;能够区分每个月的天数。 RTC特点&#xff1a;能从RTC获取到具体的日期时间&#xff0c;断掉后再开机时间仍然准确&#xff08;需要纽扣电池&#xff…

如何控制项目管理中的日程冲突?

《全球公司生产力报告》发现&#xff0c;62% 的公司领导表示&#xff0c;资源调度是他们在项目管理方面面临的最大挑战。其中&#xff0c;日程冲突是利用共享资源池管理多个项目的典型挑战。例如&#xff0c;团队成员参与的活动可能会重叠&#xff0c;也可能是任务分配给了无法…

漏洞复现-SpringBlade export-user SQL 注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【MySQL】NET HELPMSG 3534 报错解决

问题&#xff1a; 解决方案&#xff1a; 注意&#xff1a;确保自己是否使用了带管理员权限的命令窗口。 1.清空你的 MySQL 下的 data 文件夹&#xff1b; 2.确保系统环境变量中已经配置了 mysql 的 bin 目录到Path中&#xff1b; 3.执行以下命令&#xff1a; mysql8为我自己…

【linux】 查看 Linux 重启历史记录(reboot)

了解 Linux 重启日志 /var/log 目录隐藏着 Linux 日志机制的核心信息&#xff0c;它是记录系统活动的宝贵仓库。然而&#xff0c;仅仅有日志还不够&#xff0c;真正的难题在于&#xff0c;如何从大量数据中提炼出与系统重启相关的关键信息。 在 /var/log 目录中&#xff0c;可…

力扣746. 使用最小花费爬楼梯

动态规划 思路&#xff1a; 定义 dp[i] 为到达下标 i 层的最小花费&#xff1b;则状态转移方程为&#xff1a; 第 i 层可以从第 i - 1 层爬一层或者第 i - 2 层爬两层到达&#xff1b;则 dp[i] std::min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2])初始状态&#xff1a…

【操作系统】实验一 Linux操作系统安装

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Tofu5m目标识别跟踪器

Tofu5m 是高性价比目标识别跟踪模块&#xff0c;支持可见光视频或红外网络视频的输入&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能&#xff0c;提供多机版与触控版管理软件&#xff0c;为二次…

Ant Design Vue 的a-tree-select中的show-search不生效问题

解决方案&#xff1a; 1、配置show-search 2、配置tree-node-filter-prop tree-node-filter-prop的值为接口返回的显示文本&#xff0c;就是你下拉框显示的那个本文 演示&#xff1a;

Web03--CSS进阶

1、CSS常用属性 1.1 文本字体相关属性设置 样式名 描述 text-align 设置内容位置 text-decoration 控制下划线 none没有 underline有 line-hight 行高 font-size 设置字体大小 font-weight 设置字体粗细的 font-famliy 设置字体样式 letter-spacing 设置中文字…

2023年度AI盘点 AIGC|AGI|ChatGPT|人工智能大模型

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 文章目录 前言01 《ChatGPT 驱动软件开…

C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景

一、call_once 单例模式 Singleton 大家可以先看这篇文章&#xff1a;https://zh.cppreference.com/w/cpp/thread/call_once /*std::call_oncevoid call_once( std::once_flag& flag, Callable&& f, Args&&... args ); */ #include <iostream> #i…

龙湖集团2023年销售额减少约14%:股价屡创新低,股东难言满意

近日&#xff0c;龙湖集团控股有限公司&#xff08;HK:00960&#xff0c;下称“龙湖集团”或“龙湖”&#xff09;发布了2023年未经审核运营数据。2023年&#xff0c;龙湖集团实现经营性收入248.7亿元&#xff0c;同比增加6.28%&#xff1b;其中运营收入约129.4亿元&#xff0c…

CM11 链表分割

链表分割_牛客题霸_牛客网 (nowcoder.com) 一、思路分析 二、源码 一、思路分析 创建两个链表small、big 遍历原来链表 比X小的节点尾插到small 比X大的节点尾插到big 最后来链接起来 这样不会改变各个节点的相对顺序 二、源码 ListNode* partition(ListNode* pHead,…