C++(2)
二、面向对象基础
1. 类与对象
1.1 核心概念
类(Class)
- 定义:抽象描述具有共同特征和行为的对象模板
- 本质:代码复用的蓝图,定义数据(属性)与操作(行为)的集合
- 命名规范:大驼峰命名法(如
MobilePhone
)
对象(Object)
- 定义:类的具体实例化实体
- 生命周期:创建到销毁的整个过程
- 内存分配:分为栈对象(自动释放)和堆对象(手动管理)
思考:对象是否可以脱离类存在?
不可以。类是对象的抽象模板,没有类定义的对象无法创建。
1.2 类的构成要素
// 手机类示例
class MobilePhone {
public:// 属性(成员变量)string brand;string model;int weight;// 行为(成员函数)void play_music() {cout << "来财,憋老仔" << endl;}void run_game() {cout << "无畏契约、LOL、CF、永杰物件、原神、梦幻西游、第五人格、三国杀、火影忍者、小鳄鱼爱洗澡、完蛋我被美女包围了、天天酷跑、森林冰火人、黑猴、狼人杀、腐蚀、三角洲、古墓丽影、塞尔达、王者荣耀、奇迹暖暖、逆战、dnf、cs" << endl;}void call() {cout << "给女神打,您拨打的电话正在通话中,请稍后在播" << endl;}
};
1.3 对象内存管理
栈对象 vs 堆对象
特性 | 栈对象 | 堆对象 |
---|---|---|
创建方式 | MobilePhone mp; | MobilePhone* mp = new MobilePhone; |
生命周期 | 自动释放(离开作用域) | 需手动delete 释放 |
访问方式 | . 操作符 | -> 操作符 |
内存泄漏风险 | 无 | 高(需手动管理) |
代码示例
// 栈对象示例
void stackExample() {MobilePhone mp; // 栈内存分配mp.brand = "华为";mp.model = "遥遥领先";mp.weight = 500;cout << mp.brand << " " << mp.model << " " << mp.weight << endl;mp.play_music();mp.run_game();mp.call();// 函数结束时自动销毁
}// 堆对象示例
void heapExample() {MobilePhone* mp = new MobilePhone; // 堆内存对象mp->brand = "小米";mp->model = "mi6";mp->weight = 200;cout << mp->brand << " " << mp->model << " " << mp->weight << endl;mp->play_music();mp->run_game();mp->call();delete mp; // 必须手动释放mp = nullptr;// 防止野指针
}
1.4 构造函数
构造函数规则表
特性 | 说明 |
---|---|
命名规则 | 与类名完全一致 |
返回值 | 无返回值类型 |
自动调用时机 | 对象创建时(栈/堆) |
默认构造 | 无参构造函数,未定义其他构造时自动生成 |
多样化构造方式
class PhoneBuilder {
private:string brand;string os;public:// 默认构造PhoneBuilder() : brand("Unknown"), os("No OS") {}// 全参构造PhoneBuilder(string b, string o) : brand(b), os(o) {}// 参数默认值构造PhoneBuilder(string b, string o = "Android") {brand = b;os = o;}
};// 使用示例
PhoneBuilder a; // 调用默认构造
PhoneBuilder b("Xiaomi", "MIUI"); // 全参构造
PhoneBuilder c("OPPO"); // 参数默认值构造
1.5 拷贝构造函数
浅拷贝 vs 深拷贝
类型 | 实现方式 | 内存风险 | 适用场景 |
---|---|---|---|
浅拷贝 | 直接复制成员变量的值 | 高(指针共享) | 简单数据类型 |
深拷贝 | 为新对象分配独立内存空间 | 低 | 包含动态内存对象 |
代码示例
// 浅拷贝(存在隐患)
class ShallowCopy {
private:int* data;
public:ShallowCopy(int val) { data = new int(val); }~ShallowCopy() { delete data; }
};// 深拷贝(安全实现)
class DeepCopy {
private:int* data;
public:DeepCopy(int val) { data = new int(val); }DeepCopy(const DeepCopy& other) { data = new int(*other.data); }~DeepCopy() { delete data; }
};
1.6 析构函数
class ResourceHandler {
private:FILE* filePtr;
public:ResourceHandler(string path) {filePtr = fopen(path.c_str(), "r");}~ResourceHandler() {if(filePtr) fclose(filePtr); // 自动资源释放}
};
2. 封装
2.1 访问控制实践
class SecurePhone {
private: // 仅类内可访问string secretCode;public: // 对外接口void setCode(string code) {if(code.length() == 6) secretCode = code;}string getCode() const {return "****-" + secretCode.substr(3,2);}
};
封装优势
- 数据隐藏:防止非法访问
- 接口统一:修改内部实现不影响外部调用
- 逻辑解耦:分层架构的基础
3. 静态成员与作用域
3.1 静态成员变量
class Test {
public:static int sharedCounter; // 类级共享Test() { sharedCounter++; }
};int Test::sharedCounter = 0; // 类外初始化
3.2 单例模式
class Singleton {
private:static Singleton* instance;Singleton() {}
public:static Singleton* getInstance() {if(instance == nullptr) {instance = new Singleton();}return instance;}
};
Singleton* Singleton::instance = nullptr;
4. 关键字与高级特性
4.1 const约束
class ImmutableData {
private:const int id;
public:ImmutableData(int id) : id(id) {} // 初始化列表int getID() const { return id; } // 常量成员函数
};
4.2 this指针
class ChainCall {
private:int value;
public:ChainCall& add(int num) {this->value += num; // 解决成员变量遮蔽return *this; // 返回自身引用}
};
相关文章:
C++(2)
二、面向对象基础 1. 类与对象 1.1 核心概念 类(Class) 定义:抽象描述具有共同特征和行为的对象模板本质:代码复用的蓝图,定义数据(属性)与操作(行为࿰…...

美SEC主席:探索比特币上市证券交易所
作者/演讲者:美SEC主席Paul S. Atkins 编译:Liam 5月12日,由美国SEC加密货币特别工作组发起的主题为《资产上链:TradFi与DeFi的交汇点》系列圆桌会议如期举行。 会议期间,现任美SEC主席Paul S. Atkins发表了主旨演讲。…...
@Controller 与 @RestController-笔记
1.Controller与RestController对比 Spring MVC 中 Controller 与 RestController 的功能对比: Controller是Spring MVC中用于标识一个类作为控制器的标准注解。它允许处理HTTP请求,并返回视图名称,通常和视图解析器一起使用来渲染页面。而R…...
JavaScript篇:揭秘函数式与命令式编程的思维碰撞
大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了…...
c++和c的不同
c:面向对象(封装,继承,多态),STL,模板 一、基础定义与背景 C语言 诞生年代:20世纪70年代,Dennis Ritchie在贝尔实验室开发。主要特点: 过程式、结构化编程面向系统底层…...

MySQL Join连接算法深入解析
引言 在关系型数据库中,Join操作是实现多表数据关联查询的关键手段,直接影响查询性能和资源消耗。MySQL支持多种Join算法,包括经典的索引嵌套循环连接(Index Nested-Loop Join)、块嵌套循环连接(Block Nes…...
从构想到交付:专业级软开发流程详解
目录 一、软件开发生命周期(SDLC)标准化流程 1. 需求工程阶段(Requirement Engineering) 2. 系统设计阶段(System Design) 3. 开发阶段(Implementation) 4. 测试阶段&a…...
腾讯云-人脸核身+人脸识别教程
一。产品概述 慧眼人脸核身特惠活动 腾讯云慧眼人脸核身是一组对用户身份信息真实性进行验证审核的服务套件,提供人脸核身、身份信息核验、银行卡要素核验和运营商类要素核验等各类实名信息认证能力,以解决行业内大量对用户身份信息真实性核实的需求&a…...

http请求卡顿
接口有时出现卡顿,而且抓包显示有时tcp目标机器没有响应, 但nginx和java应用又没有错误日志,让人抓耳挠腮,最终还是请运维大哥帮忙,一顿操作后系统暂时无卡顿了,佩服的同时感觉疑惑到底调整了啥东…...
使用Vite打包前端Vue项目,碰到依赖包体积大,出现内存溢出的解决办法
vite.config.ts 中 方式一 使用 esbuild build: {outDir: "dist",minify: "esbuild",sourcemap: false,chunkSizeWarningLimit: 5000,rollupOptions: {experimentalLogSideEffects: false,output: {// 最小化拆分包manualChunks(id) {if (id.includes(&q…...
C语言_函数调用栈的汇编分析
在 C 语言的底层实现中,函数调用栈是程序运行时内存管理的核心机制。它不仅负责函数间的控制转移,还管理局部变量、参数传递和返回值。本文将结合 C 语言代码和 x86-64 汇编指令,深入解析函数调用栈的工作原理。 一、函数调用栈的基本概念 函数调用栈是内存中的一块后进先…...
Java Spring Boot 控制器中处理用户数据详解
目录 一、获取请求参数1.1 获取查询参数1.2 获取路径参数 二、处理表单提交2.1 处理表单数据 三、处理 JSON 数据3.1 接收 JSON 数据 四、返回 JSON 数据五、处理文件上传5.1 单文件上传5.2 多文件上传 六、总结 在 Spring Boot 应用开发中,控制器(Contr…...

vite+vue建立前端工程
参考 开始 | Vite 官方中文文档 VUE教程地址 https://cn.vuejs.org/tutorial/#step-1 第一个工程 https://blog.csdn.net/qq_35221977/article/details/137171497 脚本 chcp 65001 echo 建立vite工程 set PRO_NAMEmy-vue-appif not exist %PRO_NAME% (call npm i…...
【Docker】docker login总是报各种超时错误,导致登录不成功。
报错信息:Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).等超时错误。 解决方案:docker login总是报各种超时错…...

vue使用路由技术实现登录成功后跳转到首页
文章目录 一、概述二、使用步骤安装vue-router在src/router/index.js中创建路由器,并导出在vue应用实例中使用router声明router-view标签,展示组件内容 三、配置登录成功后跳转首页四、参考资料 一、概述 路由,决定从起点到终点的路径的进程…...

day20-线性表(链表II)
一、调试器 1.1 gdb(调试器) 在程序指定位置停顿 1.1.1 一般调试 gcc直接编译生成的是发布版(Release) gcc -g //-g调式版本,(体积大,内部有源码)(DeBug&#…...
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
函数重载的定义 函数重载是指在同一作用域内,可以有多个同名函数,但是这些函数的参数列表(参数的个数、类型或顺序)不同。编译器会根据调用函数时传递的实际参数来确定具体调用哪个重载函数。 C不支持函数重载的原因 C语言的编译器…...
Python机器学习笔记(二十二、模型评估-交叉验证)
交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。 在交叉验证中,数据被多次划分,并且需要训练多个模型。最常用的交叉验证是k折交叉验证(k-fold cross-validation),其中k是由用户指定的数字,通常取5或10…...
Python爬虫实战:获取woodo网各类免费图片,积累设计素材
1. 引言 在设计素材收集领域,woodo 网(吾道)提供了大量高质量的设计图片资源。然而,手动下载这些图片效率低下,且难以批量获取。开发自动化爬虫系统能够有效解决这一问题,但面临网站反爬机制、数据去重、并发控制等技术挑战。本文提出的爬虫系统针对 woodo 网站特点进行…...
Go语言运算符详解
文章目录 1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符运算符优先级注意事项 Go语言提供了与其他语言类似的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等。这些运算符即可满足基本的运算需求。 1. 算…...

HTTP 连接复用机制详解
文章目录 HTTP 连接复用机制详解为什么需要连接复用?连接复用的实现方式HTTP/1.1 的 Keep-AliveHTTP/2 多路复用 HTTP/1.1 的队头阻塞问题 HTTP 连接复用机制详解 HTTP 连接复用是 HTTP/1.1 及更高版本中的核心优化机制,旨在减少 TCP 连接建立和关闭的开…...

网络协议分析 实验六 TCP和端口扫描
文章目录 实验6.1 TCP(Transfer Control Protocol)练习二 利用仿真编辑器编辑并发送TCP数据包实验6.2 UDP端口扫描实验6.3 TCP端口扫描练习一 TCP SYN扫描练习二 TCP FIN扫描 实验6.1 TCP(Transfer Control Protocol) 建立:syn,syn ack,ack 数据传送:tcp…...

Spring Web MVC————入门(2)
1,请求 我们接下来继续讲请求的部分,上期将过很多了,我们来给请求收个尾。 还记得Cookie和Seesion吗,我们在HTTP讲请求和响应报文的时候讲过,现在再给大家讲一遍,我们HTTP是无状态的协议,这次的…...
Python知识框架
一、Python基础语法 变量与数据类型 变量命名规则 基本类型:int, float, str, bool, None 复合类型:list, tuple, dict, set 类型转换与检查(type(), isinstance()) 运算符 算术运算符:, -, *, /, //, %, ** 比较…...

每日算法-250514
每日算法学习记录 (2024-05-14) 今天记录三道 LeetCode 算法题的解题思路和代码。 1. 两数之和 题目截图: 解题思路 这道题要求我们从一个整数数组中找出两个数,使它们的和等于一个给定的目标值 target,并返回这两个数的下标。 核心思路是使用 哈希…...

嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比
目录 一、gdb调试 (一)一般调试步骤与命令 (二)找段错误(无下断点的地方) (三)调试命令 二、单向链表练习 1、查找链表的中间结点(用快慢指针) 2、找出…...

虚拟机安装CentOS7网络问题
虚拟机安装CentOS7网络问题 1. 存在的问题1.1 CentOS7详细信息 2. 解决问题3.Windows下配置桥接模式 1. 存在的问题 虽然已经成功在虚拟机上安装了CentOS7,但是依旧不能上网。 1.1 CentOS7详细信息 [fanzhencentos01 ~]$ hostnamectlStatic hostname: centos01Ic…...
零基础学Java——终章:核心知识点与面试总结
Java核心知识点与面试总结 本文档旨在总结Java的核心知识点,并提供常见的面试问题与解答,帮助学习者巩固知识和准备面试。 目录 零基础学Java——大纲合集 Java基础 1. Java概述 JDK (Java Development Kit): Java开发工具包,包含Java的…...

迅为RK3588开发板安卓GPIO调用APP运行测试
将网盘上的安卓工程文件复制到 Windows 电脑上。确保工程路径中使用英文字符,不包含中文。接着,启动 Android Studio,点击“Open”按钮选择应用工程文件夹,然后点击“OK”。由于下载 Gradle 和各种 Jar 包可能需要一段时间&#x…...
在一台CentOS服务器上开启多个MySQL服务
1. 创建目录 mkdir -p /data/mysql3307/{data,tmp,logs} # 赋权 chown -R mysql:mysql /data/mysql3307 chmod -R 750 /data/mysql3307 2.修改 /etc/my.cnf ,添加[mysqld3307]实例配置组 [mysqld3307] # mysql服务的端口 port 3307 # 套接字文件存放路径 socket /…...