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

程序代码篇---C++类.c\.h


文章目录

  • 前言
  • 第一部分:C++中的类
    • 1.类的定义
    • 2.成员变量(属性)
    • 3.成员函数(方法)
    • 4.访问修饰符
      • 私有
      • 受保护
      • 公有
    • 5.构造函数和析构函数
      • 成员初始化列表
      • 方法重载
    • 6.继承
    • 7.多态
    • 8.友元
  • 第二部分:.c与.h文件
    • 头文件(.h 或 .hpp)
      • 类定义
      • 结构体定义
      • 枚举
      • 函数原型
      • 宏定义
      • 类型定义
      • 常量定义
      • 作用
    • 源文件(.c 或 .cpp)
      • 函数实现
      • 全局变量定义
      • 局部静态变量的定义
      • 作用
    • 优势
      • 模块化
      • 编译效率
      • 封装
      • 减少编译时间
      • 注意事项
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了C++中的类以及.c和.h文件的使用。


第一部分:C++中的类

C++中的类(Class)是面向对象编程(OOP)的核心概念之一。类是一种用户定义的数据类型,它封装了数据成员(通常称为属性或字段)和成员函数(通常称为方法或操作)。以下是C++类的基本组成部分和详细介绍:

1.类的定义

类定义以关键字 class 开始,后跟类名和类体,类体被大括号 {} 包围。类定义通常包括私有(private)或保护(protected)成员以及公有(public)成员。

class ClassName {
private:// 私有成员(属性和方法)
protected:// 保护成员(属性和方法)
public:// 公有成员(属性和方法)
};

2.成员变量(属性)

成员变量是类中定义的数据,它们可以是任何类型,包括基本类型、复合类型或用户定义的类型。

class Person {
private:std::string name;int age;
};

3.成员函数(方法)

成员函数定义了类的行为,它们可以访问类的成员变量。

class Person {
public:void setName(const std::string& newName) {name = newName;}std::string getName() const {return name;}void setAge(int newAge) {age = newAge;}int getAge() const {return age;}
};

4.访问修饰符

私有

私有(private):只有类内部的方法可以访问私有成员。

受保护

保护(protected):保护成员与私有成员类似,但它们可以被派生类访问。

公有

公有(public):公有成员可以被类的外部代码访问。

5.构造函数和析构函数

构造函数用于初始化类的对象,而析构函数用于在对象生命周期结束时执行清理工作。

class Person {
public:Person(const std::string& name, int age) : name(name), age(age) {}~Person() {}// 其他成员...
};

成员初始化列表

在构造函数中,成员初始化列表用于初始化成员变量。

Person(const std::string& name, int age) : name(name), age(age) {}

方法重载

类中可以有多个同名的方法,只要它们的参数列表不同即可

class Person {
public:void print() const {std::cout << "Name: " << name << ", Age: " << age;}void print(int indent) const {for (int i = 0; i < indent; ++i) std::cout << " ";print();}// 其他成员...
};

6.继承

类可以继承另一个类的成员,提供代码重用的能力。

class Student : public Person {
public:Student(const std::string& name, int age, const std::string& major): Person(name, age), major(major) {}// 新的方法和属性...
private:std::string major;
};

7.多态

通过虚函数,类可以实现多态,允许使用基类指针或引用来调用派生类的函数。

class Person {
public:virtual void introduce() const {std::cout << "I am a person.";}// 其他成员...
};class Student : public Person {
public:void introduce() const override {std::cout << "I am a student.";}// 其他成员...
};

8.友元

友元函数或类可以访问另一个类的私有或保护成员

class Person {friend void printPerson(const Person& p);// 其他成员...
};void printPerson(const Person& p) {std::cout << p.name << " is " << p.age << " years old.";
}

类是C++面向对象编程的基础,通过使用类,可以创建出结构清晰、易于维护和扩展的程序。上述只是类的基本概念,实际上C++类还包含许多高级特性,如模板类、运算符重载、异常处理等,大家感兴趣可以自己学习。

第二部分:.c与.h文件

在C和C++编程中,通常将类的定义和实现分开存储在不同的文件中。这通常涉及到两个文件类型:头文件(.h 或 .hpp)和源文件(.c 或 .cpp)。以下是它们各自的作用:

头文件(.h 或 .hpp)

头文件通常包含以下内容:

类定义

类定义:包括类的成员变量和成员函数声明。

结构体定义

结构体定义:结构体声明

枚举

枚举定义:枚举类型声明

函数原型

函数原型:在源文件中定义的函数的****声明

宏定义

宏定义:预处理器宏声明

类型定义

类型定义:使用 typedef 或 using 关键字定义的类型别名

常量定义

常量定义:常量声明

作用

头文件的作用是提供接口,使得其他源文件可以包含和使用这些声明。通过在源文件中包含头文件,编译器能够知道类、函数、宏等的类型和接口。

示例:

// Person.h
#ifndef PERSON_H
#define PERSON_Hclass Person {
public:Person(const std::string& name, int age);~Person();void setName(const std::string& newName);std::string getName() const;void setAge(int newAge);int getAge() const;private:std::string name;int age;
};#endif // PERSON_H

源文件(.c 或 .cpp)

源文件包含以下内容:

函数实现

函数实现:头文件中声明的函数的具体实现。
类成员函数的实现:头文件中声明的类成员函数的具体实现。

全局变量定义

全局变量定义:全局变量的定义和初始化。

局部静态变量的定义

局部静态变量的定义:局部静态变量的定义和初始化。

作用

源文件的作用是提供实现,即头文件中声明的函数和类的具体代码。

示例:

// Person.cpp
#include "Person.h"Person::Person(const std::string& name, int age) : name(name), age(age) {}Person::~Person() {}void Person::setName(const std::string& newName) {name = newName;
}std::string Person::getName() const {return name;
}void Person::setAge(int newAge) {age = newAge;
}int Person::getAge() const {return age;
}

优势

分离头文件和源文件的好处

模块化

模块化:将**接口(头文件)实现(源文件)**分开,有助于代码的组织和管理。

编译效率

编译效率:头文件中的内容通常不会频繁更改,因此当头文件中的内容不变时,只需要重新编译更改过的源文件,而不需要重新编译所有包含该头文件的源文件。

封装

封装:用户只需要知道如何使用接口(通过头文件),而不必关心内部实现细节。

减少编译时间

减少编译时间:因为源文件是分开编译的,所以编译器不需要在每个源文件中重新解析整个类定义。

注意事项

头文件应该包含保护宏(如 #ifndef, #define, #endif),以防止头文件被多次包含。
源文件通常不需要保护宏,因为它们不会被其他文件包含。
在源文件中包含对应的头文件是必要的,以确保类成员函数的实现与声明一致。
头文件中不应包含函数和类的定义之外的任何实现代码,以避免链接时的问题。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了C++中的类以及.c和.h文件的使用。

相关文章:

程序代码篇---C++类.c\.h

文章目录 前言第一部分&#xff1a;C中的类1.类的定义2.成员变量&#xff08;属性&#xff09;3.成员函数&#xff08;方法&#xff09;4.访问修饰符私有受保护公有 5.构造函数和析构函数成员初始化列表方法重载 6.继承7.多态8.友元 第二部分&#xff1a;.c与.h文件头文件&…...

@RabbitListener处理重试机制完成后的异常捕获

application.properties中配置开启手动签收 spring.rabbitmq.listener.direct.acknowledge-modemanual spring.rabbitmq.listener.simple.acknowledge-modemanual定义一个重试器 Slf4j Configuration public class RabbitMQRetryConfing {Bean("customRetry")publi…...

Mac 上管理本地 Go 版本

在 Mac 上修改本地 Go 版本可以通过多种方法实现。以下是几种常见且详细的操作方案&#xff1a; 方法一&#xff1a;使用 goenv 管理多版本&#xff08;推荐&#xff09; 适用场景&#xff1a;需要频繁切换不同 Go 版本&#xff0c;适合长期开发者。 步骤&#xff1a; 安装 g…...

低代码系统-产品架构案例介绍、得帆云(八)

产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台&#xff0c;区别于阿里云、腾讯云 Dehoop 指…...

免费GPU算力,不花钱部署DeepSeek-R1

在人工智能和大模型技术飞速发展的今天&#xff0c;越来越多的开发者和研究者希望能够亲自体验和微调大模型&#xff0c;以便更好地理解和应用这些先进的技术。然而&#xff0c;高昂的GPU算力成本往往成为了阻碍大家探索的瓶颈。幸运的是&#xff0c;腾讯云Cloud Studio提供了免…...

JavaEE:多线程进阶

JavaEE&#xff1a;多线程进阶 一、对比不同锁策略之间的应用场景及其区别1. 悲观锁 和 乐观锁1.1 定义和原理1.2 应用场景1.3 示例代码 2. 重量级锁 和 轻量级锁2.1 定义和原理2.2 应用场景2.3 示例代码 3. 挂起等待锁 和 自旋锁3.1 定义和原理3.2 应用场景3.3 示例代码 4. 几…...

不只是mini-react第二节:实现最简fiber

省流|总结 首先&#xff0c;我们编写JSX文件&#xff0c;并通过Babel等转换工具将其转化为createElement()函数的调用&#xff0c;最终生成虚拟 DOM&#xff08;Vdom&#xff09;格式。举个例子&#xff1a; // 原始 JSX const App <div>hi-mini-react</div>;//…...

C++实现设计模式---命令模式 (Command)

命令模式 (Command) 命令模式 是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使得可以用不同的请求对客户端进行参数化、对请求排队或记录日志&#xff0c;以及支持可撤销的操作。 意图 将操作的调用者与接收者分离&#xff0c;通过将请求封装为独…...

设计模式的艺术-享元模式

结构性模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解享元模式 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。 在享元模式中&#xff0c;存储这些共享实例对象的地方称为享元池&…...

Linux的权限和一些shell原理

目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型&#xff1a; 基本权限&#xff1a; chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后&#xff1a; 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…...

【Postgres_Python】使用python脚本批量创建和导入多个PG数据库

之前批量创建和导入数据库分为2个python脚本进行&#xff0c;现整合优化代码合并为一个python脚本&#xff0c;可同步实现数据库的创建和数据导入。之前的文章链接&#xff1a; 【Postgres_Python】使用python脚本批量创建PG数据库 【Postgres_Python】使用python脚本将多个.S…...

Ubuntu安装GitLab

在 Ubuntu 上安装 GitLab 的步骤如下。这里以 GitLab Community Edition&#xff08;CE&#xff09;为例&#xff1a; 前提条件 确保你的 Ubuntu 系统是 20.04 或更高版本。确保你的系统满足 GitLab 的硬件要求。 步骤 更新系统包&#xff1a; sudo apt update sudo apt upg…...

网络知识小科普--5

81、什么是组播路由? 组播路由是一种有针对性的广播形式&#xff0c;将消息发送到所选择的用户组&#xff0c;而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…...

JavaScript学习记录23

第十一节 JSON对象 1. JSON 格式 JSON 格式&#xff08;JavaScript Object Notation 的缩写&#xff09;是一种用于数据交换的文本格式&#xff0c;2001年由 Douglas Crockford 提出&#xff0c;目的是取代繁琐笨重的 XML 格式。 相比 XML 格式&#xff0c;JSON 格式有两个显…...

VScode 开发 Springboot 程序

1. 通过maven创建springboot程序 输入 mvn archetype:generate 选择模板&#xff0c;一般默认选择为第 7 种方式&#xff1b; 选择之后&#xff0c;一般要你填写如下内容&#xff1a; groupId: 组织名称&#xff1b;artifactId: 项目名称&#xff1b;version: 版本&#xff0…...

.git/hooks/post-merge 文件的作用

.git/hooks/post-merge 文件是 Git 版本控制系统中的一个钩子&#xff08;hook&#xff09;脚本&#xff0c;其作用是在合并&#xff08;merge&#xff09;操作完成后自动执行一些特定的操作。以下是关于 .git/hooks/post-merge 文件作用的详细解释&#xff1a; 作用 自动化任…...

Kafak 单例生产者实现-C#操作

前面写了一篇入门操作的文章,因为工作需要,简单修改了下如何实现单例生产者。 Kafka入门-C#操作_c# kafka-CSDN博客文章浏览阅读1.6k次,点赞20次,收藏9次。2).报错:“kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state…...

Cursor开发前端的详细过程

以下是使用 Cursor 开发前端的详细过程&#xff1a; 一、创建项目 打开 Cursor 并新建项目&#xff1a; 启动 Cursor 编辑器。点击 “File” 菜单&#xff0c;选择 “New Project”。在弹出的对话框中&#xff0c;输入项目名称&#xff0c;如 “MyFrontendProject”&#xff0…...

基于微信小程序的移动学习平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

atheris从安装到fuzz输入输出解读

1. 引入 模糊测试是一种自动化的软件测试技术&#xff0c;它通过自动生成大量随机数据作为输入来测试程序&#xff0c;以发现潜在的错误、漏洞或崩溃。atheris是一个专门用于CPython&#xff08;Python的C语言实现&#xff09;的模糊测试框架。 2. 安装atheris 参考1&#x…...

别再自己造轮子了!STM32F103 RTC时间戳转换,用标准库<time.h>更香(附完整代码)

STM32F103 RTC时间处理&#xff1a;为什么标准库<time.h>是你的最佳选择 第一次在STM32上实现RTC功能时&#xff0c;我花了整整三天时间调试自己写的时间戳转换算法。直到某个深夜&#xff0c;我才发现原来C标准库早已提供了完美解决方案——那一刻既兴奋又懊恼。如果你也…...

别再乱配了!华为防火墙+S5700三层交换机组网,这5个坑我帮你踩过了

华为防火墙与S5700三层交换机组网避坑指南&#xff1a;5个致命错误与解决方案 刚接手华为防火墙与S5700三层交换机的组网项目时&#xff0c;我以为按标准模板配置就能万事大吉。直到凌晨三点还在机房排查网络不通的故障&#xff0c;才明白教科书式的配置在实际环境中远远不够。…...

不止于教程:用QGIS 3.30 + PyQt5从零打造一个极简版GIS桌面应用

从零构建GIS桌面应用&#xff1a;QGIS 3.30与PyQt5深度整合实战 当我们需要开发一个轻量级地理信息系统时&#xff0c;QGIS的Python API提供了强大而灵活的选择。不同于简单的脚本编写&#xff0c;将QGIS作为引擎嵌入到自定义PyQt5应用中&#xff0c;能够实现高度定制化的GIS解…...

2026别错过!降AI率工具深度测评与推荐

2026年真正好用的AI论文降重与改写工具&#xff0c;核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

GEE实战:MODIS NDVI数据高效获取与自动化处理全流程

1. 从零开始认识MODIS NDVI数据 第一次接触遥感数据分析的朋友可能会被各种专业术语搞得晕头转向。别担心&#xff0c;我们先来聊聊这个"MODIS NDVI"到底是什么。简单来说&#xff0c;NDVI&#xff08;归一化差值植被指数&#xff09;就像是给地球做体检的"体温…...

FreeFileSync 14.9更新:多维度优化提升使用体验

FreeFileSync 14.9&#xff1a;核心功能更新亮点FreeFileSync作为一款适用于Windows、macOS和Linux的开源文件夹对比和同步软件&#xff0c;在14.9版本有了诸多重要更新。在Linux系统方面&#xff0c;支持高DPI显示器上的200%显示缩放&#xff0c;这对于使用高分辨率显示器的用…...

如何从碎片化信息中构建系统性科研认知?

在科研工作中&#xff0c;我们常常面临这样一种困境&#xff1a;每天通过各种渠道接触到海量的学术信息&#xff0c;这些信息如同散落的拼图碎片&#xff0c;虽然珍贵&#xff0c;却难以自动拼凑成一幅完整的画面。对于许多科研人员而言&#xff0c;难以形成系统认知是一个巨大…...

云手机 流畅稳定 操作简单

云手机依托云端服务器集群&#xff0c;配备企业级 GPU和高性能 CPU&#xff0c;通过资源池化技术&#xff0c;将物理算力切割成多个独立安卓实例&#xff0c;每个云手机实例可独占或动态共享强大资源&#xff0c;算力远超本地旗舰手机&#xff0c;能轻松运行大型 3D 游戏等高性…...

Shell脚本实战指南:从零基础到自动化高手

1. Shell脚本入门&#xff1a;从Hello World到实战 第一次接触Shell脚本时&#xff0c;我和大多数人一样&#xff0c;被那些神秘的符号和命令搞得一头雾水。直到我意识到&#xff0c;Shell脚本其实就是把平时在终端里手动输入的命令&#xff0c;写进一个文件里自动执行。举个例…...

Java程序员6年焦虑,转行AI后薪资暴涨40%!这8个岗位,普通人也能入局?年薪百万不是梦!

文章讲述了一位Java程序员老周因对纯业务开发感到焦虑&#xff0c;于去年3月开始系统学习AI相关技术&#xff0c;并于去年7月成功跳槽至AI创业公司&#xff0c;薪资涨幅达40%。文章分析了2026年AI相关岗位的招聘趋势&#xff0c;指出AI岗位需求旺盛&#xff0c;但需要程序员具备…...