【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代码分为头文件(.h)和源文件(.cpp)的做法有以下几个好处: 模块化和代码组织:将函数和类的声明(包括函数原型、类的成员和属性等)放在头文件中,将函数和类的…...
报错ssh: Could not resolve hostname
…按照网上好多教程试了一下: 新建密钥,添加到gitee,重新测试。修改host,加入gitee的ip地址到里面去。修改.gifconfig配置文件,配置成ssh的仓库链接。 这上面的方法都不行,后面发现一篇文章:SS…...
从零开始学网站建设:从需求分析到上线发布
从零开始学网站建设:从需求分析到上线发布 一、需求分析 在进行网站建设之前,首先需要与客户进行沟通,了解客户的需求和要求,并进行深入的分析和研究。根据不同的需求,需要确定网站的类型、功能、布局、风格等方面的…...
软件系统验收测试需要注意的地方
验收测试 一、软件验收测试含义: 软件验收测试是指测试人员检验软件是否符合软件规格说明书和用户需求的测试活动。 验收测试是软件测试的最后一个环节,也是最为关键的一个要素。 它关系到软件开发公司的产品质量,也关系到需求方的产品能…...
解决three.js中加载纹理贴图时,初次渲染不显示的问题
效果: 解决方法:主要是将一些构建网格对象的操作放在了textureLoader.load()方法中,加载图片也用了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 取消工作…...
建筑模板木模好还是钢模好
在建筑施工中,模板是一项关键的工程,对于建筑结构的质量和施工效率起着重要作用。在选择模板材料时,木模和钢模都是常见的选择。本文将比较木模和钢模的优缺点,以帮助您做出明智的选择。 正文:一、木模:传统…...
写代码中碰到的错误
bind绑定类内成员导致 "no matching function for call to ..." 当bind绑定类内成员时,需要指明绑定的成员所在类的位置。 上面未指明Remove函数在哪个类中从而导致错误。 此外 bind 的函数指针类型是const类型的,都需要添加 const 修饰。 S…...
java文件传输简单方法
java文件传输简单方法 假设现在已经打包了一个文件(1233444333),要将这个文件传输给另一方: 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(336A4940CSP16)是一种数字输入模块,通常用于工业控制和自动化系统中,以将数字信号输入到PLC(可编程逻辑控制器)或其他控制系统中。以下是一些可能的产品特点和功能,但请注意&am…...
比特币与火人节
作者:Greg Cipolaro,NYDIG 全球研究主管 编译:WEEX 唯客 阅读提要: 灰度胜诉后市场缺乏后续动力,这告诉我们什么信号? ETF 不断涌现,但投资者似乎不太关心。 比特币和火人节:它们有何…...
Nginx 中 location 和 proxy_pass 斜杠/ 问题
location 的斜杠问题比较好理解,不带斜杠的是模糊匹配。例如: location /doc 可以匹配 /doc/index.html,也可以匹配 /docs/index.html。 location /doc/ 强烈建议使用这种 只能匹配 /doc/index.html,不能匹配 /docs/index…...
【Spring】开发框架Spring核心技术含Resource接口详细讲解
这里写目录标题 前言1. Spring简介2. Spring体系结构2.1 核心模块(Core Container)2.2 AOP模块2.3 数据访问集成模块(Data Access/Integration )2.4 Web模块 3. 初识Ioc与DI3.1 IoC控制反转和DI依赖注入3.2 常见的几种注入方法3.3 Spring的IoC例子3.4 Sp…...
【随想】每日两题Day.5 (实则一题)
题目:LeetCode 707.设计链表 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还…...
【LeetCode刷题笔记】动态规划 — 70.爬楼梯
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 更多算法知识专栏:算法分析🔥 给大家跳段街舞感谢…...
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 一、介绍 将某个字段的相同值分为一组,分组查询的结果强调的是一个整体,每组内容只显示一行分组查询的内容一般要查询分组字段,因…...
Swoole 介绍以及 编译安装
Swoole是什么? Swoole是一个PHP语言的开源异步网络通信引擎,它是以PHP语言为基础,以C语言编写的扩展。它可以让PHP语言程序拥有异步网络通信能力,并且能够支持高并发、高性能的TCP/UDP/Unix Socket/HTTP服务器。 Swoole的优势 …...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
