当前位置: 首页 > news >正文

【C++】源文件.cpp和头文件.h分离编程

优势介绍

将C++代码分为头文件(.h)和源文件(.cpp)的做法有以下几个好处:

模块化和代码组织:将函数和类的声明(包括函数原型、类的成员和属性等)放在头文件中,将函数和类的实现(具体的函数逻辑、成员函数的定义等)放在源文件中。这种分离有助于对代码进行模块化和组织,使代码更加清晰和可维护。头文件可以作为接口文档,给其他开发人员提供使用代码的相关信息。

可重用性:将代码逻辑和实现分离可以增加代码的可重用性。头文件中的声明可以被多个源文件引用,这样不同的源文件可以共享相同的函数和类的定义,避免了重复编写相同的代码。这对于开发大型项目或者多人合作开发非常有用,可以提高开发效率。

编译效率:当头文件被多个源文件包含时,编译器只需编译一次头文件即可,然后在编译不同的源文件时,只需链接相应的目标文件即可。这样可以提高编译效率,减少编译时间。如果将所有代码都写在一个文件中,每次修改都需要重新编译整个文件,非常耗时。

隐藏实现细节:头文件中只包含函数和类的声明,并不包含实现的细节,这样可以隐藏具体的实现逻辑。只有源文件中包含了实现的代码,其他文件无法直接访问和修改具体的实现,从而保护了代码的安全性和稳定性。

总结起来,将C++代码分为头文件和源文件可以提高代码的可维护性、可重用性和编译效率,同时也可以隐藏实现细节,保护代码的安全性。这是一种良好的编程实践,尤其适用于大型项目或者多人协作开发的情况下。

举个栗子

假设在分离cpp和h文件之前,我们把所有写在cpp中,得到一下文件:

#include<iostream>
using namespace std;class Pencil{
public:void setSize(int size){p_size=size;}void inform(){cout<<"这是一个铅笔"<<endl;}int get_size(){return p_size;}
private:int p_size;
};
class Book{
public:void setSize(int size){b_size=size;}void inform(){cout<<"这是一本书"<<endl;}int get_size(){return b_size;}
private:int b_size;
};
class SchoolBag{
public:void set_info(int p_size,int b_size){p.setSize(p_size);b.setSize(b_size);}void show_info(){p.inform();cout<<"size="<<p.get_size()<<endl;b.inform();cout<<"size="<<b.get_size()<<endl;}
private:Pencil p;Book b;
};
int main()
{SchoolBag s;s.set_info(10,100);s.show_info();return 0;
}

分离之后,会得到:

pencil.h pencil.cpp book.h book.cpp school.h school.cpp main.cpp

分别写在下面

pencil.h:

#pragma once
#include<iostream>
using namespace std;
class Pencil {
public:void setSize(int size);void inform();int get_size();
private:int p_size;
};

book.h

#pragma once
#include<iostream>
using namespace std;
class Book {
public:void setSize(int size);void inform();int get_size();
private:int b_size;
};

schoolbag.h

#pragma once
#include "pencil.h"
#include "book.h"
class SchoolBag {
public:void set_info(int p_size, int b_size);void show_info();
private:Pencil p;Book b;
};

pencil.cpp

#include "pencil.h"
void Pencil::setSize(int size)
{p_size = size;
}
void Pencil::inform()
{cout << "这是一个铅笔" << endl;
}
int Pencil::get_size()
{return p_size;
}

book.cpp

#include "book.h"
void Book::setSize(int size)
{b_size = size;
}
void Book::inform()
{cout << "这是一本书" << endl;
}
int Book::get_size()
{return b_size;
}

schoolbag.cpp

#include "schoolbag.h"
void SchoolBag::set_info(int p_size, int b_size)
{p.setSize(p_size);b.setSize(b_size);
}
void SchoolBag::show_info()
{p.inform();cout << "size=" << p.get_size() << endl;b.inform();cout << "size=" << b.get_size() << endl;
}

main.cpp

#include "schoolbag.h"int main()
{SchoolBag s;s.set_info(10, 100);s.show_info();return 0;
}

运行方法

注意运行的时候一定要把上面的七个文件进行“编译链接”比如放在visual studio里面之后,运行main可以自动实现上述功能。如果运行在dev cpp里面不编译链接,是无法运行的:

相关文章:

【C++】源文件.cpp和头文件.h分离编程

优势介绍 将C代码分为头文件&#xff08;.h&#xff09;和源文件&#xff08;.cpp&#xff09;的做法有以下几个好处&#xff1a; 模块化和代码组织&#xff1a;将函数和类的声明&#xff08;包括函数原型、类的成员和属性等&#xff09;放在头文件中&#xff0c;将函数和类的…...

报错ssh: Could not resolve hostname

…按照网上好多教程试了一下&#xff1a; 新建密钥&#xff0c;添加到gitee&#xff0c;重新测试。修改host&#xff0c;加入gitee的ip地址到里面去。修改.gifconfig配置文件&#xff0c;配置成ssh的仓库链接。 这上面的方法都不行&#xff0c;后面发现一篇文章&#xff1a;SS…...

从零开始学网站建设:从需求分析到上线发布

从零开始学网站建设&#xff1a;从需求分析到上线发布 一、需求分析 在进行网站建设之前&#xff0c;首先需要与客户进行沟通&#xff0c;了解客户的需求和要求&#xff0c;并进行深入的分析和研究。根据不同的需求&#xff0c;需要确定网站的类型、功能、布局、风格等方面的…...

软件系统验收测试需要注意的地方

验收测试 一、软件验收测试含义&#xff1a; 软件验收测试是指测试人员检验软件是否符合软件规格说明书和用户需求的测试活动。 验收测试是软件测试的最后一个环节&#xff0c;也是最为关键的一个要素。 它关系到软件开发公司的产品质量&#xff0c;也关系到需求方的产品能…...

解决three.js中加载纹理贴图时,初次渲染不显示的问题

效果&#xff1a; 解决方法&#xff1a;主要是将一些构建网格对象的操作放在了textureLoader.load()方法中&#xff0c;加载图片也用了require init() {// 1, 创建场景对象this.scene new this.$three.Scene();// 2, 创建立方缓冲几何体this.geometry new this.$three.BoxGe…...

Git学习记录

Contest 一、工作区域二、操作命令2.1 创建仓库2.2 查看仓库状态2.3 从工作区向暂存区添加文件2.3.1 只添加一个文件2.3.2 添加全部文件 2.4 从暂存区向仓库区添加文件2.5 查询日志2.5.1 从当前版本开始查询2.5.2 查看所有日志 2.6 回滚2.6.1 从仓库回滚到工作区2.6.2 取消工作…...

建筑模板木模好还是钢模好

在建筑施工中&#xff0c;模板是一项关键的工程&#xff0c;对于建筑结构的质量和施工效率起着重要作用。在选择模板材料时&#xff0c;木模和钢模都是常见的选择。本文将比较木模和钢模的优缺点&#xff0c;以帮助您做出明智的选择。 正文&#xff1a;一、木模&#xff1a;传统…...

写代码中碰到的错误

bind绑定类内成员导致 "no matching function for call to ..." 当bind绑定类内成员时&#xff0c;需要指明绑定的成员所在类的位置。 上面未指明Remove函数在哪个类中从而导致错误。 此外 bind 的函数指针类型是const类型的&#xff0c;都需要添加 const 修饰。 S…...

java文件传输简单方法

java文件传输简单方法 假设现在已经打包了一个文件&#xff08;1233444333&#xff09;&#xff0c;要将这个文件传输给另一方&#xff1a; import java.io.*; public class F_PasswordUnPassword { public static void main (String[] args)throws Exception { ByteArrayOutp…...

Vue3后台管理系统Element-plus_侧边栏制作_无限递归

在home.view中添加代码 <template><div><div class"common-layout"><el-container><el-header class"common-header flex-float"><div class"flex"><img class"logo" src"../assets/logo…...

PCIe基础概念

《PCI_Exepress体系结构导读》《WDC databook》读书笔记 RCB read completion boundary MPS max payload size MRRS max read request size 4K对齐 Specifies the address page boundary size supported by the AXI bridge. No packet can have an address that crosses…...

GE IS220PVIBH1A 336A4940CSP16 数字输入模块

GE IS220PVIBH1A&#xff08;336A4940CSP16&#xff09;是一种数字输入模块&#xff0c;通常用于工业控制和自动化系统中&#xff0c;以将数字信号输入到PLC&#xff08;可编程逻辑控制器&#xff09;或其他控制系统中。以下是一些可能的产品特点和功能&#xff0c;但请注意&am…...

比特币与火人节

作者&#xff1a;Greg Cipolaro&#xff0c;NYDIG 全球研究主管 编译&#xff1a;WEEX 唯客 阅读提要&#xff1a; 灰度胜诉后市场缺乏后续动力&#xff0c;这告诉我们什么信号&#xff1f; ETF 不断涌现&#xff0c;但投资者似乎不太关心。 比特币和火人节&#xff1a;它们有何…...

Nginx 中 location 和 proxy_pass 斜杠/ 问题

location 的斜杠问题比较好理解&#xff0c;不带斜杠的是模糊匹配。例如&#xff1a; location /doc 可以匹配 /doc/index.html&#xff0c;也可以匹配 /docs/index.html。 location /doc/ 强烈建议使用这种 只能匹配 /doc/index.html&#xff0c;不能匹配 /docs/index…...

【Spring】开发框架Spring核心技术含Resource接口详细讲解

这里写目录标题 前言1. Spring简介2. Spring体系结构2.1 核心模块(Core Container)2.2 AOP模块2.3 数据访问集成模块&#xff08;Data Access/Integration &#xff09;2.4 Web模块 3. 初识Ioc与DI3.1 IoC控制反转和DI依赖注入3.2 常见的几种注入方法3.3 Spring的IoC例子3.4 Sp…...

【随想】每日两题Day.5 (实则一题)

题目&#xff1a;LeetCode 707.设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还…...

【LeetCode刷题笔记】动态规划 — 70.爬楼梯

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…...

2024腾讯校招后端面试真题汇总及其解答(三)

21【算法题】反转链表 题目: 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head = [1,2] 输出:[2,1]示例 3: 输入:head = [] 输出:[]提示: 链表中节点的数目范围是 [0, 5…...

mysql的分组group by

文章目录 一、介绍1、分组查询的内容2、多字段分组3、将查询内容连接group_concat4、有条件的分组查询having 一、介绍 将某个字段的相同值分为一组&#xff0c;分组查询的结果强调的是一个整体&#xff0c;每组内容只显示一行分组查询的内容一般要查询分组字段&#xff0c;因…...

Swoole 介绍以及 编译安装

Swoole是什么&#xff1f; Swoole是一个PHP语言的开源异步网络通信引擎&#xff0c;它是以PHP语言为基础&#xff0c;以C语言编写的扩展。它可以让PHP语言程序拥有异步网络通信能力&#xff0c;并且能够支持高并发、高性能的TCP/UDP/Unix Socket/HTTP服务器。 Swoole的优势 …...

音频编辑新革命:Audacity 4 终极免费解决方案,让专业音频处理触手可及

音频编辑新革命&#xff1a;Audacity 4 终极免费解决方案&#xff0c;让专业音频处理触手可及 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 还在为昂贵的音频编辑软件发愁吗&#xff1f;或者对复杂的音频处理工…...

高效转换:Markdown与思维导图的无缝衔接指南

1. 为什么需要Markdown与思维导图的相互转换&#xff1f; 第一次接触Markdown和思维导图时&#xff0c;我就被它们的简洁高效所吸引。Markdown用简单的语法就能写出结构清晰的文档&#xff0c;而思维导图则能直观展示复杂的逻辑关系。但真正让我头疼的是&#xff0c;这两种工具…...

[多控制器适配] 通过BetterJoy实现Switch手柄在PC游戏中的无缝集成 [创新协议转换技术]

[多控制器适配] 通过BetterJoy实现Switch手柄在PC游戏中的无缝集成 [创新协议转换技术] 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: …...

BilibiliDown深度指南:从零掌握B站视频下载的7大核心技巧

BilibiliDown深度指南&#xff1a;从零掌握B站视频下载的7大核心技巧 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirror…...

WiFi DensePose:用无线电波“看透“世界 — 无摄像头人体感知革命

No cameras. No wearables. No Internet. Just radio waves. 没有摄像头&#xff0c;没有可穿戴设备&#xff0c;不需要联网。只有物理世界的无线电波。&#x1f31f; 引言&#xff1a;重新定义"感知" 想象这样一个场景&#xff1a;一位独居老人在浴室摔倒&#xff0…...

为什么 CFO 总在年底为固定资产失眠?一位 IT 运维的亲历复盘

上个月&#xff0c;我作为外部顾问&#xff0c;去一家年营收5亿的科技公司做系统健康检查。刚进机房&#xff0c;IT主管就苦笑&#xff1a;“我们的 ERP 里有 1200 台设备&#xff0c;但仓库扫码只扫出 780 台——剩下的&#xff0c;要么‘失踪’&#xff0c;要么重复录入了三次…...

深入浅出:从地平线J5的“安全岛”设计,聊聊车规级SoC的功能安全到底在保什么?

地平线J5的"安全岛"设计&#xff1a;车规芯片如何守护生命线&#xff1f; 清晨7点30分&#xff0c;北京五环路上的一辆新能源车正以60公里时速自动跟车行驶。突然&#xff0c;前车急刹&#xff0c;车载摄像头捕捉到这一信号后&#xff0c;视觉处理芯片必须在0.1秒内完…...

用FFmpeg实现Android中的MediaExtractor 一

下图是整个MediaExtractor需要实现的方法和类,在后续的篇章会逐渐解释这些方法和类 下图是整个MediaExtractor需要实现的方法和类,在后续的篇章会逐渐解释这些方法和类 extractor.drawio 前提 通过 MediaExtractor启动流程 可以知道, 当系统服务加载MediaExtractor插件时,…...

C#多线程编程实战:Interlocked类如何帮你避免数据竞争(附性能对比)

C#多线程编程实战&#xff1a;Interlocked类如何帮你避免数据竞争&#xff08;附性能对比&#xff09; 当你在开发一个需要处理高并发的C#应用时&#xff0c;是否遇到过计数器结果不准确、标志位莫名其妙被重置的诡异情况&#xff1f;这些看似简单的多线程问题&#xff0c;往往…...

【计算机网络】0.0.0.0与127.0.0.1的深度解析:从本地回环到默认路由的实战应用

1. 从一次奇怪的连接问题说起 那天我在调试一个本地服务时遇到了件怪事&#xff1a;用服务器的内网IP&#xff08;192.168.1.100&#xff09;、127.0.0.1甚至直接输入0都能成功连接。这让我意识到很多开发者其实并不真正理解这些特殊IP地址的行为差异。就像开车时只知道踩油门能…...