面向对象编程高级概念详解

面向对象编程(Object-Oriented Programming, OOP)不仅是一种编程范式,更是一种思考和设计软件的方法。本文将深入探讨OOP中的几个核心概念,包括析构函数、深浅拷贝、静态成员、单例模式、操作符重载、友元以及前++与后++的区别,并通过具体例子加以说明。

目录

析构函数

定义

作用

示例


 

析构函数

定义

析构函数以波浪线(~)开头,无返回类型,也无参数,用于释放对象占用的资源。它是对象生命周期结束时自动调用的特殊成员函数。

作用

  • 清理资源:销毁对象的成员变量,特别是那些动态分配的内存。
  • 执行清理操作:执行任何在对象被销毁前需要完成的任务。

示例

class A{};class AutoPtr {
public:AutoPtr(A* f) : m_f(f) {printf("AutoPtr(A* f)\n");}~AutoPtr() {printf("~AutoPtr()\n");delete m_f;}A* operator->() {return m_f;}A& operator*() {return *m_f;}AutoPtr(const AutoPtr& that){this->m_f = that.m_f;}
private:A* m_f;
};

深浅拷贝

概念

  • 浅拷贝:默认拷贝构造函数和拷贝赋值操作符只复制指针,不复制指针所指的数据。
  • 深拷贝:手动定义拷贝构造函数和拷贝赋值操作符,确保指针所指数据也被复制。

示例

class DeepCopyExample {
public:DeepCopyExample(int size) {m_data = new int[size];for (int i = 0; i < size; ++i) m_data[i] = i;}// 深拷贝构造函数DeepCopyExample(const DeepCopyExample& other) {m_size = other.m_size;m_data = new int[m_size];std::copy(other.m_data, other.m_data + m_size, m_data);}// 深拷贝赋值运算符DeepCopyExample& operator=(const DeepCopyExample& other) {if (this != &other) {delete[] m_data;m_size = other.m_size;m_data = new int[m_size];std::copy(other.m_data, other.m_data + m_size, m_data);}return *this;}~DeepCopyExample() {delete[] m_data;}private:int* m_data;int m_size;
};

 静态成员

特点

  • 生命周期:静态成员不属于任何对象实例,从程序开始执行到结束。
  • 访问:可通过类名直接访问,无需实例化对象。
  • 共享:静态成员变量为类的所有实例共享。

示例

class Counter {
public:static int getCount() { return count; }static void incrementCount() { ++count; }private:static int count; // 静态成员变量,需要在类外初始化
};// 静态成员变量的初始化
int Counter::count = 0;

 单例模式

目标

确保一个类只有一个实例,并提供一个全局访问点。

实现

  • 私有构造函数:防止外部直接创建对象。
  • 静态公共成员函数:作为获取实例的唯一入口。

示例(懒汉式)

#include <string>
#include <iostream>
#include <memory>class imageSaveThread{
public:~imageSaveThread();static std::shared_ptr<imageSaveThread>& getInstance(const std::string& filePath){//静态方法 不使用对象调用if(ImageSaveThread == nullptr){ImageSaveThread = std::shared_ptr<imageSaveThread>(new imageSaveThread(filePath));}return ImageSaveThread;};void complex();static int statics;
private:imageSaveThread(std::string filePath);imageSaveThread(const imageSaveThread&)  = delete;imageSaveThread& operator=(const imageSaveThread&)=delete;static std::shared_ptr<imageSaveThread> ImageSaveThread;std::string filePath;};

操作符重载

用途

改变或扩展操作符在特定类中的行为,使其适用于自定义类型。

示例

 

class Complex {
public:Complex(double real, double imag) : real_(real), imag_(imag) {}Complex operator+(const Complex& other) const {return Complex(real_ + other.real_, imag_ + other.imag_);}private:double real_;double imag_;
};// 使用
Complex a(1, 2);
Complex b(3, 4);
Complex c = a + b; /

友元

作用

允许一个类或函数访问另一个类的私有和保护成员。

示例

 

class Circle {friend class Rectangle; // 声明Rectangle为友元类private:double radius;public:Circle(double r) : radius(r) {}
};class Rectangle {
public:void printCircleRadius(const Circle& c) {std::cout << "Circle radius: " << c.radius << std::endl; // 可以访问Circle的私有成员}
};

通过以上讨论和示例,我们可以看到,面向对象编程的这些高级特性极大地丰富了代码的表现力和功能,同时也要求开发者更加细致地考虑对象的生命周期管理、资源分配与释放、以及类间的关系与访问权限,从而设计出更加健壮和高效的软件系统。

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

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

相关文章

Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff0c;如果…

用友NC pagesServlet SQL注入致RCE漏洞复现(XVE-2024-13067)

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /portal/pt/servlet/pagesServlet/doPost接口…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…

SM国密加密算法简介

国密&#xff08;商密&#xff09;算法算法类型是否公开技术特点应用场景SM1对称密码算法否&#xff0c;需要加密芯片的接口进行调用加密强度与AES相当电子政务/商务&#xff0c;智能IC卡、加密卡等SM2非对称密码算法是基于ECC&#xff0c;签名速度与密钥生成速度快于RSA&#…

Vue3 全屏组件 源码

在Vue 3中&#xff0c;实现了全屏功能的组件&#xff0c;开箱即用。 使用了screenfull依赖库&#xff0c;可以省去浏览器适配的麻烦。 代码如下&#xff1a; <template><div ref"myFullScreen" ><slot></slot></div> </template…

ResizeObserver监听画布尺寸改变动态渲染echarts

前言&#xff1a; 在日常开发中有时遇到同数据相关的业务可能会用到echarts插件。一般在封装echarts组件的时候大家可能都会通过windows对象监听浏览器窗口大小的改变动态渲染echarts,这样当echarts窗口改变导致echarts画布元素大小改变的同时&#xff0c;就能调用相关api进行重…

RocketMQ相关知识知多少

一、RocketMQ的定义 官网网址&#xff1a;领域模型概述 | RocketMQ Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨&#xff0c;RocketMQ 已经成为业内共识的金…

Flink的简单学习二

一 Flink的核心组件 1.1 client 1.将数据流程图DataFlow发送给JobManager。 1.2 JobManager 1.收集client的DataFlow图&#xff0c;将图分解成一个个的task任务&#xff0c;并返回状态更新数据给client 2.JobManager负责作业调度&#xff0c;收集TaskManager的Heartbeat和…

方法调研:DDOS检测有哪些方法?

检测DDoS攻击的方法多种多样,主要可以归纳为以下几类:流量分析、行为分析、协议分析、分布式检测和基于机器学习的方法。每种方法都有其独特的优势和适用场景。以下是这些方法的详细介绍: 1. 流量分析 基线分析 原理:建立正常流量的基线,通过比较当前流量与基线的偏差来…

【Java】--SpringBoot 统一异常处理

目录 统一异常处理 统一异常处理 通过使用注解ControllerAdvice&#xff08;控制器通知类&#xff09;ExceptionHandler&#xff08;异常处理器&#xff09;来实现&#xff0c;两个结合表示出现异常的时候执行某个通知&#xff0c;即执行某个方法事件。 对应的异常类执行对应…

三、基于图像分类预训练编码及图神经网络的预测模型 【框图+源码】

背景&#xff1a; 抽时间补充&#xff0c;先挖个坑。 一、模型结构 二、源码

美团一面:什么是CAS?有什么优缺点?我说你说的是AtomicInteger吗?

引言 传统的并发控制手段&#xff0c;如使用synchronized关键字或者ReentrantLock等互斥锁机制&#xff0c;虽然能够有效防止资源的竞争冲突&#xff0c;但也可能带来额外的性能开销&#xff0c;如上下文切换、锁竞争导致的线程阻塞等。而此时就出现了一种乐观锁的策略&#x…

解析Java中1000个常用类:ProcessHandle.Info类,你学会了吗?

效率工具 推荐一个程序员常用的工具网站:程序员常用工具(http://tools.cxyroad.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。云服务器 云服务器限时免费领:轻量服务器2核4G腾讯云:2核2G4M云服务器新老同享99元/年,续费同价阿…

企业数字化转型的测度难题:基于大语言模型的新方法与新发现

《经济研究》新文章《企业数字化转型的测度难题&#xff1a;基于大语言模型的新方法与新发现》运用机器学习和大语言模型构造一套新的企业数字化转型指标。理论分析和数据交叉验证均表明&#xff0c;构建的指标相对已有方法更准确&#xff1a; 1.第一步&#xff1a;选择“管理…

17.Redis之主从复制

1.主从复制是怎么回事&#xff1f; 分布式系统, 涉及到一个非常关键的问题: 单点问题 单点问题&#xff1a;如果某个服务器程序, 只有一个节点(只搞一个物理服务器, 来部署这个服务器程序) 1.可用性问题,如果这个机器挂了,意味着服务就中断了~ 2.性能/支持的并发量也是比较有限…

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解

【HarmonyOS】鸿蒙系统中应用权限等级介绍、定义、申请授权讲解 针对权限等级&#xff0c;相对于主体来说&#xff0c;会有不同的细分概念。 一、权限APL等级&#xff1a; 首先在鸿蒙系统中&#xff0c;对于权限本身&#xff0c;分为三个等级&#xff1a;normal&#xff0c;s…

(9)svelte 教程: Event Modifiers

&#xff08;9&#xff09;svelte 教程&#xff1a; Event Modifiers 什么是 Event Modifiers Event Modifiers 是 Svelte 框架中的一种特性&#xff0c;它允许你在绑定事件处理函数时&#xff0c;添加一些修饰符来修改事件的默认行为或事件流。通过这些修饰符&#xff0c;可…

SQL面试问题集

目录 Q.左连接和右连接的区别 Q.union 和 union all的区别 1、取结果的交集 2、获取结果后的操作 Q.熟悉开窗函数吗&#xff1f;讲一下row_number和dense_rank的区别。 Q.hive行转列怎么操作的 Q.要求手写的题主要考了聚合函数和窗口函数&#xff0c;row_number()&#…

TypeScript算法每日一题:最富有客户的资产总量(1672)

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 题库&#xff1a;力扣 题目序号&#xff1a;1672&#xff08;简单&#xff09; 题目&#xff1a;最富有客户的资产总量 给你一个m x n的整数网格accounts&#xff…

同一个tomcat不同端口运行不同项目

第一步&#xff1a;修改 server.xml 文件 修改 tomcat 安装目录下 conf/server.xml 文件&#xff0c;需要几个端口就添加几个 Service 节点。 配置 2 个端口&#xff1a;9131 和 9133&#xff0c;于是增加两个 Service 节点。 每个 Service 节点的 name 属性值要设置不同的值…