力扣 螺旋矩阵-54

螺旋矩阵-54

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int m = matrix.size(),n = matrix[0].size();//数组的行列大小int top=0,down=m-1,left = 0,right = n-1;//分别为矩阵上下左右的边界int index = 0;//存放结果数组的索引vector<int>nums(m*n);//用来存放结果while(index<m*n){for(int i = left;i<=right;i++)//向右遍历{nums[index++] = matrix[top][i];}++top;//向右遍历之后矩阵当前层最上面一行就不需要再遍历,所以++topfor(int i = top;i<=down;i++)//向下遍历{nums[index++] = matrix[i][right];}--right;//向下遍历之后矩阵当前层最右面一行就不需要再遍历,所以--rightif(top<=down)//不加if判断的话就会发生重遍历或者访问越界错误{for(int i = right;i>=left;i--)//向左遍历{nums[index++] = matrix[down][i];}--down;//向左遍历之后矩阵当前层最下面一行就不需要再遍历,所以--down}if(left<=right)//不加if判断的话就会发生重遍历或者访问越界错误{for(int i = down;i>=top;i--)//向上遍历{nums[index++] = matrix[i][left];}++left;//向上遍历之后矩阵当前层最左面一行就不需要再遍历,所以++left}}return nums;}
};

每日问题

什么是封装性?C++中如何实现封装? 封装性的好处是什么?

什么是封装性?

封装(Encapsulation)是面向对象编程(OOP)的四大基本特性之一,指的是将数据(成员变量)和操作数据的方法(成员函数)结合在一起,并对外界隐藏数据的具体实现细节,只暴露接口供外界访问和操作。

简单来说,封装就是“把数据和操作数据的代码捆绑在一起,并通过公开的接口与外界进行交互”。它帮助隐藏对象的内部实现细节,使得外部只能通过提供的接口与对象交互,而不能直接访问对象的内部数据。

C++中如何实现封装?

C++通过使用类(class)和访问控制修饰符(如 private、protected 和 public)来实现封装。

        1.private: 该访问控制修饰符下的成员只能被类的成员函数访问,不能被类外部的代码直接访问。

        2.protected: 该访问控制修饰符下的成员可以在类的成员函数中访问,也可以在继承该类的派生类中访问。

        3.public: 该访问控制修饰符下的成员可以被任何外部代码访问。

通过将数据成员设为 private,并通过 public 成员函数访问和修改这些数据成员,C++ 实现了封装性。

示例代码:
#include <iostream>
using namespace std;class BankAccount {
private:// 账户余额是私有的,外部无法直接访问double balance;public:// 构造函数初始化余额BankAccount(double initialBalance) {if (initialBalance >= 0)balance = initialBalance;elsebalance = 0;}// 公共方法,用于存款void deposit(double amount) {if (amount > 0)balance += amount;elsecout << "Deposit amount must be positive!" << endl;}// 公共方法,用于取款void withdraw(double amount) {if (amount > 0 && amount <= balance)balance -= amount;elsecout << "Invalid withdrawal amount!" << endl;}// 公共方法,用于获取余额double getBalance() const {return balance;}
};int main() {BankAccount account(1000);  // 创建账户并初始化余额为1000cout << "Initial balance: " << account.getBalance() << endl;account.deposit(500);  // 存款500cout << "After deposit: " << account.getBalance() << endl;account.withdraw(200);  // 取款200cout << "After withdrawal: " << account.getBalance() << endl;account.withdraw(1500);  // 试图取款超过余额cout << "After invalid withdrawal: " << account.getBalance() << endl;return 0;
}

在上面的代码中:

balance 是私有的 (private),外部代码无法直接修改账户余额。

deposit()、withdraw() 和 getBalance() 是公有的 (public),外部可以通过它们访问和修改余额。

通过 deposit() 和 withdraw() 控制存款和取款的逻辑,从而避免了不合法的操作(例如取款超过余额)。

封装性的好处:

1.数据隐藏(信息隐藏):

封装使得对象的内部实现细节对外部隐藏,外部无法直接访问和修改对象的状态。这可以防止外部代码直接改变对象的关键数据,保护数据的安全性。

2.提高代码的安全性:

通过封装,开发人员可以确保数据只能通过特定的方法访问或修改,避免了错误的操作(例如直接修改余额)导致程序出现不可预测的行为。

3.代码的可维护性和可扩展性:

封装使得类的实现细节与外部代码解耦。这样,修改类的内部实现时,外部代码不需要做修改,只要接口不变,外部代码可以继续工作。因此,封装有助于提升代码的可维护性和可扩展性。

4.减少代码耦合:

外部代码只能通过类提供的公有接口与对象交互,减少了外部对内部实现的依赖,从而减少了代码耦合度,增加了系统的灵活性。

5.易于调试和测试:

由于类的内部数据不被外部直接访问,数据的访问和修改通过公有函数进行,可以方便地在函数内部加入检查机制,保证数据的有效性和正确性。同时,封装也便于对类进行单元测试。

6.抽象性增强:

封装是面向对象的另一项基本特性,它增强了抽象性。通过封装,外部系统只需要关注如何使用类的接口,而不需要了解类的内部实现,进一步增强了代码的抽象性。

总结:

封装是面向对象编程的重要特性,它通过将数据和方法封装在类中,保护数据的安全性、提升代码的可维护性与可扩展性。C++通过访问控制修饰符(private、protected 和 public)实现封装,封装带来的好处包括信息隐藏、数据安全性、代码的可维护性和灵活性等。

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

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

相关文章

设计模式——单例模式和工厂模式

单例模式:一个类只创建一个类对象&#xff08;节省内存减少类对象数量,一个类对象多次重复使用&#xff09; 格式: class a: pass ba() z1b z2b #z1和z2为同一个类对象 工厂模式&#xff1a;&#xff08;大批量创建具体的类对象,统一类对象入口便于维护&#xf…

【el-dialog关闭前重置表单】

el-dialog关闭前重置表单 问题描述区别解释 问题描述 el-dialog的before-close能接收一个回调函数&#xff0c;在对话框关闭前执行需要的动作&#xff0c;例如我需要的是重置对话框中的表单。 如果只有一个对话框&#xff0c;或者说回调函数不需要额外参数&#xff0c;那么对话…

Unity教程(十九)战斗系统 受击反馈

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

从感知到认知:解读人工智能技术的核心突破

引言&#xff1a;感知与认知的人工智能之旅 人工智能的演进历程&#xff0c;就像人类的成长过程&#xff0c;从最初学会“看”“听”“感知”这个世界&#xff0c;到逐渐具备“理解”“推理”和“决策”的能力。这两个阶段——感知与认知&#xff0c;不仅是人工智能的技术核心&…

文生图模型开源之光!ComfyUI - AuraFlow本地部署教程

一、模型介绍 AuraFlow 是唯一一个真正开源的文生图模型&#xff0c;由Fal团队开源&#xff0c;其代码和权重都放在了 FOSS 许可证下。基于 6.8B 参数优化模型架构&#xff0c;采用最大更新参数化技术&#xff0c;还重新标注数据集提升指令遵循质量。在物体空间和色彩上有优势…

SpringMVC ——(1)

1.SpringMVC请求流程 1.1 SpringMVC请求处理流程分析 Spring MVC框架也是⼀个基于请求驱动的Web框架&#xff0c;并且使⽤了前端控制器模式&#xff08;是⽤来提供⼀个集中的请求处理机制&#xff0c;所有的请求都将由⼀个单⼀的处理程序处理来进⾏设计&#xff0c;再根据请求…

#HarmonyOS篇: 学习资料

学习课堂 https://developer.huawei.com/consumer/cn/training/ https://developer.huawei.com/consumer/cn/doc/start/training-introduction-0000001181392655 华为开发者指导手册 https://developer.huawei.com/consumer/cn/doc/start/guidebook-0000001056335559 博客…

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…

python基于基于自然语言处理技术的话题文本分类

大家好我是君君学姐&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于基于自然语言处理技术的话题文本分类》毕业设计项目。项目源码以及部署相关请联系君君学姐&#xff0c;文末附上联系信息 。 &#x1f388;作者&#xff1a;君君学姐&#x1f388; …

iOS如何操作更新推送证书

最近收到一份邮件,应该如何操作呢,证书还是跟以前一样冲钥匙串直接申请吗 Hello, As we announced in October, the Certification Authority (CA) for Apple Push Notification service (APNs) is changing. APNs will update the server certificates in sandbox on January…

ShardingSphere-JDBC

1. 什么是分库分表&#xff1f; 分库分表是一种数据库扩展技术&#xff0c;通过将数据拆分到多个数据库&#xff08;分库&#xff09;或多个表&#xff08;分表&#xff09;中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力&…

Scala的正则表达式二

验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字&#xff0c;大小写字母&#xff0c;下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法&#xff0c;是数字开头val name2 "admin123"//合法val name3 &quo…

谈谈web3

全面解析 Web3&#xff1a;未来互联网的革命性进程 引言&#xff1a;互联网进化的三部曲 互联网的发展经历了三个重要阶段&#xff0c;每一个阶段都深刻地改变了我们的生活方式&#xff1a; Web1&#xff08;1990-2005&#xff09;&#xff1a;静态互联网时代&#xff0c;人…

mysql高级篇 | 尚硅谷 | 第11章_数据库的设计规范

十一、数据库的设计规范 文章目录 十一、数据库的设计规范一、为什么需要数据库设计二、范式1、范式简介2、范式都包括哪些3、键和相关属性的概念4、第一范式(1st NF)5、第二范式(2nd NF)6、第三范式(3rd NF)7.小结 三、反范式化1、概述2、应用举例3、反范式的新问题4、反范式的…

【汽车】-- 发动机类型

汽车发动机根据不同的分类标准可以分为多种类型。以下是常见的发动机类型及其特点&#xff0c;并列举相应的品牌和车型举例&#xff1a; 1. 按燃料类型分类 (1) 汽油发动机 特点&#xff1a;使用汽油作为燃料&#xff0c;通过火花塞点火&#xff0c;转速高&#xff0c;运转平…

自然语言处理的未来愿景

自然语言处理的未来愿景 在这个信息爆炸的时代,计算机如何理解和生成我们日常使用的语言,已经成为一个引人注目的问题。你有没有想过,为什么智能助手能理解你的指令?又或者,为什么社交媒体上的推荐引擎能够精准地推荐你喜爱的内容?这背后,正是自然语言处理(NLP)在发挥…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

微信小程序开发简易教程

微信小程序文件结构详解 1. 项目配置文件 project.config.json 项目的配置文件包含项目名称、appid、编译选项等配置示例&#xff1a; {"description": "项目配置文件","packOptions": {"ignore": []},"setting": {&quo…

Unix/Linux 命令行重定向操作

2>/dev/null 是一个常见的 Unix/Linux 命令行重定向操作&#xff0c;用于将标准错误&#xff08;stderr&#xff09;输出重定向到 /dev/null&#xff0c;即丢弃错误信息而不显示。理解这个表达式需要了解几个概念&#xff1a;文件描述符、重定向和特殊文件 /dev/null。 ###…

图解LinkedList底层原理

图解LinkedList底层原理 本篇将讲解Java中的一个集合LinkedList的底层实现原理&#xff0c;会查看并分析底层源码&#xff0c;结合图解的方式&#xff0c;理解其添加数据的过程 数据结构 LinkedList 是基于双向链表实现的&#xff0c;节点结构如下&#xff1a; private stati…