程序代码篇---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
文章目录 前言第一部分:C中的类1.类的定义2.成员变量(属性)3.成员函数(方法)4.访问修饰符私有受保护公有 5.构造函数和析构函数成员初始化列表方法重载 6.继承7.多态8.友元 第二部分:.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 版本可以通过多种方法实现。以下是几种常见且详细的操作方案: 方法一:使用 goenv 管理多版本(推荐) 适用场景:需要频繁切换不同 Go 版本,适合长期开发者。 步骤: 安装 g…...
低代码系统-产品架构案例介绍、得帆云(八)
产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台,区别于阿里云、腾讯云 Dehoop 指…...
免费GPU算力,不花钱部署DeepSeek-R1
在人工智能和大模型技术飞速发展的今天,越来越多的开发者和研究者希望能够亲自体验和微调大模型,以便更好地理解和应用这些先进的技术。然而,高昂的GPU算力成本往往成为了阻碍大家探索的瓶颈。幸运的是,腾讯云Cloud Studio提供了免…...
JavaEE:多线程进阶
JavaEE:多线程进阶 一、对比不同锁策略之间的应用场景及其区别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
省流|总结 首先,我们编写JSX文件,并通过Babel等转换工具将其转化为createElement()函数的调用,最终生成虚拟 DOM(Vdom)格式。举个例子: // 原始 JSX const App <div>hi-mini-react</div>;//…...
C++实现设计模式---命令模式 (Command)
命令模式 (Command) 命令模式 是一种行为型设计模式,它将请求封装为一个对象,从而使得可以用不同的请求对客户端进行参数化、对请求排队或记录日志,以及支持可撤销的操作。 意图 将操作的调用者与接收者分离,通过将请求封装为独…...
设计模式的艺术-享元模式
结构性模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解享元模式 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。 在享元模式中,存储这些共享实例对象的地方称为享元池&…...
Linux的权限和一些shell原理
目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型: 基本权限: chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后: 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…...
【Postgres_Python】使用python脚本批量创建和导入多个PG数据库
之前批量创建和导入数据库分为2个python脚本进行,现整合优化代码合并为一个python脚本,可同步实现数据库的创建和数据导入。之前的文章链接: 【Postgres_Python】使用python脚本批量创建PG数据库 【Postgres_Python】使用python脚本将多个.S…...
Ubuntu安装GitLab
在 Ubuntu 上安装 GitLab 的步骤如下。这里以 GitLab Community Edition(CE)为例: 前提条件 确保你的 Ubuntu 系统是 20.04 或更高版本。确保你的系统满足 GitLab 的硬件要求。 步骤 更新系统包: sudo apt update sudo apt upg…...
网络知识小科普--5
81、什么是组播路由? 组播路由是一种有针对性的广播形式,将消息发送到所选择的用户组,而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…...
JavaScript学习记录23
第十一节 JSON对象 1. JSON 格式 JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。 相比 XML 格式,JSON 格式有两个显…...
VScode 开发 Springboot 程序
1. 通过maven创建springboot程序 输入 mvn archetype:generate 选择模板,一般默认选择为第 7 种方式; 选择之后,一般要你填写如下内容: groupId: 组织名称;artifactId: 项目名称;version: 版本࿰…...
.git/hooks/post-merge 文件的作用
.git/hooks/post-merge 文件是 Git 版本控制系统中的一个钩子(hook)脚本,其作用是在合并(merge)操作完成后自动执行一些特定的操作。以下是关于 .git/hooks/post-merge 文件作用的详细解释: 作用 自动化任…...
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 开发前端的详细过程: 一、创建项目 打开 Cursor 并新建项目: 启动 Cursor 编辑器。点击 “File” 菜单,选择 “New Project”。在弹出的对话框中,输入项目名称,如 “MyFrontendProject”࿰…...
基于微信小程序的移动学习平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
atheris从安装到fuzz输入输出解读
1. 引入 模糊测试是一种自动化的软件测试技术,它通过自动生成大量随机数据作为输入来测试程序,以发现潜在的错误、漏洞或崩溃。atheris是一个专门用于CPython(Python的C语言实现)的模糊测试框架。 2. 安装atheris 参考1&#x…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
