C++(2)

news2025/5/15 21:02:03

二、面向对象基础

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);
    }
};
封装优势
  1. 数据隐藏:防止非法访问
  2. 接口统一:修改内部实现不影响外部调用
  3. 逻辑解耦:分层架构的基础

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;        // 返回自身引用
    }
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美SEC主席:探索比特币上市证券交易所

作者/演讲者&#xff1a;美SEC主席Paul S. Atkins 编译&#xff1a;Liam 5月12日&#xff0c;由美国SEC加密货币特别工作组发起的主题为《资产上链&#xff1a;TradFi与DeFi的交汇点》系列圆桌会议如期举行。 会议期间&#xff0c;现任美SEC主席Paul S. Atkins发表了主旨演讲。…

MySQL Join连接算法深入解析

引言 在关系型数据库中&#xff0c;Join操作是实现多表数据关联查询的关键手段&#xff0c;直接影响查询性能和资源消耗。MySQL支持多种Join算法&#xff0c;包括经典的索引嵌套循环连接&#xff08;Index Nested-Loop Join&#xff09;、块嵌套循环连接&#xff08;Block Nes…

http请求卡顿

接口有时出现卡顿&#xff0c;而且抓包显示有时tcp目标机器没有响应&#xff0c; 但nginx和java应用又没有错误日志&#xff0c;让人抓耳挠腮&#xff0c;最终还是请运维大哥帮忙&#xff0c;一顿操作后系统暂时无卡顿了&#xff0c;佩服的同时感觉疑惑到底调整了啥东…

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…

vue使用路由技术实现登录成功后跳转到首页

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

day20-线性表(链表II)

一、调试器 1.1 gdb&#xff08;调试器&#xff09; 在程序指定位置停顿 1.1.1 一般调试 gcc直接编译生成的是发布版&#xff08;Release&#xff09; gcc -g //-g调式版本&#xff0c;&#xff08;体积大&#xff0c;内部有源码&#xff09;&#xff08;DeBug&#…

HTTP 连接复用机制详解

文章目录 HTTP 连接复用机制详解为什么需要连接复用&#xff1f;连接复用的实现方式HTTP/1.1 的 Keep-AliveHTTP/2 多路复用 HTTP/1.1 的队头阻塞问题 HTTP 连接复用机制详解 HTTP 连接复用是 HTTP/1.1 及更高版本中的核心优化机制&#xff0c;旨在减少 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) 建立&#xff1a;syn,syn ack,ack 数据传送&#xff1a;tcp…

Spring Web MVC————入门(2)

1&#xff0c;请求 我们接下来继续讲请求的部分&#xff0c;上期将过很多了&#xff0c;我们来给请求收个尾。 还记得Cookie和Seesion吗&#xff0c;我们在HTTP讲请求和响应报文的时候讲过&#xff0c;现在再给大家讲一遍&#xff0c;我们HTTP是无状态的协议&#xff0c;这次的…

每日算法-250514

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

嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比

目录 一、gdb调试 &#xff08;一&#xff09;一般调试步骤与命令 &#xff08;二&#xff09;找段错误&#xff08;无下断点的地方&#xff09; &#xff08;三&#xff09;调试命令 二、单向链表练习 1、查找链表的中间结点&#xff08;用快慢指针&#xff09; 2、找出…

虚拟机安装CentOS7网络问题

虚拟机安装CentOS7网络问题 1. 存在的问题1.1 CentOS7详细信息 2. 解决问题3.Windows下配置桥接模式 1. 存在的问题 虽然已经成功在虚拟机上安装了CentOS7&#xff0c;但是依旧不能上网。 1.1 CentOS7详细信息 [fanzhencentos01 ~]$ hostnamectlStatic hostname: centos01Ic…

迅为RK3588开发板安卓GPIO调用APP运行测试

将网盘上的安卓工程文件复制到 Windows 电脑上。确保工程路径中使用英文字符&#xff0c;不包含中文。接着&#xff0c;启动 Android Studio&#xff0c;点击“Open”按钮选择应用工程文件夹&#xff0c;然后点击“OK”。由于下载 Gradle 和各种 Jar 包可能需要一段时间&#x…

Unity 红点系统

首先明确一个&#xff0c;即红点系统的数据结构是一颗树&#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中&#xff0c;之后再是对应的红点UI侧的注册&#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册&#xff0c;但是不销毁数据侧的红点注册 - …

尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)

1. NORMAL 模式&#xff08;常规模式&#xff09; 适用场景&#xff1a;一般手持拍摄&#xff0c;比如人像、静物、风景或缓慢平移镜头&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 补偿手抖引起的小幅度震动&#xff08;比如手持时自然的不稳&#xff09;&am…

从索引中排除 Elasticsearch 字段

作者&#xff1a;来自 Elastic Kofi Bartlett 说明如何配置 Elasticsearch 排除字段、为什么要这样做&#xff0c;以及应遵循的最佳实践。 更多阅读&#xff1a;Elasticsearch&#xff1a;inverted index&#xff0c;doc_values 及 source 想获得 Elastic 认证&#xff1f;了解…

超详细Docker教程

前言&#xff1a;大家在在Linux上部署mysql及其他软件时&#xff0c;大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的人以外&#xff0c;大多数人都会有相同的感受&#xff0c;那就是麻烦。核心体现在三点&#xff1a; 命令太多了&#xff…

Java项目拷打(外卖+点评)

一、点评星球&#xff08;黑马点评&#xff09; 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑&#xff0c;重点解决高并发场景下的缓存穿透、击穿、雪崩等问题&#xff0c;涵盖商户展示、优惠券秒杀…

微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg

实现效果 效果&#xff1a; 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案&#xff0c;支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …

Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载

一、前言 搞定了实时预览后&#xff0c;另一个功能就是录像回放&#xff0c;录像回放和视频点播功能完全一致&#xff0c;唯一的区别就是发送点播的sdp信息中携带了开始时间和结束时间&#xff0c;因为是录像文件&#xff0c;所以有这个时间&#xff0c;而实时视频预览这个对应…