当前位置: 首页 > 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的优势 …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...