从0开始C++(二):类、对象、封装

目录

类&对象的概念

类的内容

对象的创建

● 栈内存对象

● 堆内存对象

封装


类&对象的概念

 类和对象是一个比较抽象的概念,这里直接用一个实例方便理解。

类:类是一个抽象的概念,用来描述同一类对象的特点(比如:颜色、尺寸、价格、速度)

对象:根据类的概念所创造的实体(比如:xiaomi su7)

类的内容

类中最基础的内容包括两个部分,一个是属性,一个是行为。
● 属性:表示一些特征项的数值,比如说:颜色、型号、速度等等。而这些特征项的数值,也被称为”成员变量“。属性一般以名词存在。

● 行为:表示能执行的动作,能干什么事情?比如说:跑赛道、接入米家生态等。也被称为”成员函数“。行为一般以动词存在。

class Car
{
public: // 权限:最开放的权限string brand;   // 品牌string modle;   // 型号int weight;     // 重量
};

对象的创建

C++中存在两种类型的对象,栈内存对象和堆内存对象

● 栈内存对象

        栈内存对象的生命周期与函数的生命周期相同。这些对象存储在栈内存中,一般称为局部对象。

        当函数被调用时,会在栈内存上为函数的局部变量和对象分配内存空间。这些对象在函数执行期间可见且可用,一旦函数执行完毕,栈内存会被释放,这些对象也会随之被销毁

        对于栈内存对象,它们的创建和销毁是自动进行的,无需手动管理内存。这是由编译器自动完成的,称为栈上的自动变量。当函数被调用时,编译器会为每个局部变量和对象分配所需的内存空间,并在函数返回后释放这些内存空间。

优缺点:

        栈内存对象的优点是速度快、创建和销毁方便。然而,栈内存是有限的,其大小通常受到限制。如果函数中创建的局部变量和对象过多或占用过多的内存空间,可能会导致栈溢出的问题。因此,对于较大的对象或需要长时间存在的对象,更适合使用堆内存来进行动态分配和管理。

 创建方法:

类名 对象名;

class Car
{
public: // 权限:最开放的权限string brand;   // 品牌string modle;   // 型号int weight;     // 重量
};
int main()
{Car myCar; //  创建栈内存对象
}

● 堆内存对象

        堆内存对象是指在堆内存中动态分配的对象。与栈内存对象不同,堆内存对象的生命周期不受函数的调用和返回影响,它们可以在程序的任意位置创建和销毁。

        堆内存对象的创建需要使用特定的函数,如C++中的new运算符或malloc函数。这些函数在堆内存中分配一块指定大小的内存空间,并返回指向该内存空间的指针。通过指针,可以访问和操作堆内存对象。

        与栈内存对象不同,堆内存对象的销毁需要手动释放。在使用完堆内存对象后,需要使用特定的函数,如C++中的delete运算符或free函数,释放所占用的内存空间。如果不释放堆内存对象,就会造成内存泄漏,导致程序的内存消耗增加并可能导致程序崩溃。

优缺点:     

        堆内存对象的优点是灵活性和可控性。由于动态分配,堆内存对象的大小可以在运行时确定,而不受编译时的限制。此外,堆内存对象的生命周期可以由程序员控制,可以创建和销毁多次,可以在不同作用域中访问。但需要注意的是,堆内存的分配和释放操作相对比较耗时,也容易产生内存泄漏或悬空指针等问题,因此需要谨慎使用和管理。

创建方法

类名 *指针名 = new 类名

销毁:

delete 指针名;

class Car
{
public: // 权限:最开放的权限string brand;   // 品牌string modle;   // 型号int weight;     // 重量};
int main()
{Car *myCar = new Car; //  创建堆内存对象detele myCar; //释放空间
}

封装

在前面创建的普通类Car与结构体差别不大,实际上可以认为结构体就是一种完全开放的类。

封装指的是,将类的一些属性使用 private 进行私有化,并重新提供外部访问接口。私有化的成员只能在类内访问,封装可以提升代码的安全性,并且可以让程序员更关注上层架构而非内部细节。

class Car
{
private://权限:最私有的权限string brand;   // 品牌string modle;   // 型号int weight;     // 重量
public: // 权限:最开放的权限string get_brand()   //外部函数接口{return brand;}string get_modle(){return modle;}int get_weight(){return weight;} 
};
int main()
{Car *myCar = new Car; //  创建堆内存对象//cout << Car.brand << endl;  //错误,brand是私有成员 不能外部访问cont << Car.get_brand << endl; //可以使用预留的接口访问 
}

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

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

相关文章

第九届信也科技杯全球AI算法大赛——语音深度鉴伪识别参赛A榜 0.968961分

遗憾没有进复赛&#xff0c;只是第41名。先贴个A榜的成绩。A榜的前三十名晋级&#xff0c;个个都是99分的大佬&#xff0c;但是B榜的成绩就有点低了&#xff0c;应该是数据不同源的问题&#xff0c;第一名0.78分。官网链接&#xff1a;语音深度鉴伪识别 官方baselin:https://g…

Springboot 权限认证框架 -- SA-Token 简介(一)

引言 现今的软件开发中&#xff0c;权限认证与访问控制是每一个应用都必不可少的功能。SA-Token是一个简单、安全、易用的权限认证框架&#xff0c;它主要解决登录认证、权限认证、Session会话、单点登录等功能。SA-Token以其轻量级、零学习成本的特点&#xff0c;迅速赢得了开…

Java 网关进程在向驱动程序发送其端口号之前退出

java gateway process exited before sending the driver its port number #248TOC Spark项目 这个是远程调试的一个Spark项目&#xff0c;首先要保证 Spark正确安装&#xff0c;配置好环境变量&#xff0c;这是前提。 可能的问题 Java 网关进程是 Apache Spark 的一个关键…

数组的常用方法

1.Array.map() 此方法是将数组中的每个元素调用一个提供的函数&#xff0c;结果作为一个新的数组返回&#xff0c;并没有改变原来的数组 let arr [1, 2, 3, 4, 5]; let newArr arr.map(x > x * 2); //arr [1, 2, 3, 4, 5] 原数组保持不变 //newArr [2, 4, 6, 8, 10] …

Linux mongodb安装及简单使用

说明&#xff1a;本文章主要是对mongodb的单击安装 1.创建文件夹&#xff0c;准备安装包 cd /user/local mkdir tools 2.解压mongodb包 mkdir mongodb tar -xvf mongodb-linux-x86_64-rhel70-5.0.11.tgz -C mongodb 3.进入解压目录 cd mongodb cd mongodb-linux-x86_64-…

emm, ComfyUI的作者从Stability.AI离职了

&#x1f356;背景 今天在更新ComfyUI的过程中&#xff0c;看到Manager中有这样一段描述&#xff1a; 嗯&#xff1f;做了新的官方网站&#xff1f;然后开始新篇章&#xff1f; 难道说ComfyUI的作者从Stability.AI离职了&#xff1f; 赶紧点开链接看了下&#xff0c;emm&…

24.bytebuf创建

1.byteBuf创建方法 2.自动动态扩容的 package com.xkj.bound;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import lombok.extern.slf4j.Slf4j;@Slf4j public class TestByteBuf {public static void main(String[] args) {//bytebuf可以不指定…

Java集合框架源码分析:LinkedList

文章目录 一、LinkedList特性二、LinkedList底层数据结构三、LinkedList继承关系参考&#xff1a; 一、LinkedList特性 特性描述是否允许为空允许是否允许重复数据允许是否有序有序是否线程安全非线程安全 二、LinkedList底层数据结构 LinkedList同时实现了List接口和Deque接…

基于PLC的全自动洗衣机控制系统课设

一、设计题目 1.1课题内容 根据设计参数和控制要求&#xff0c;设计一全自动洗衣机&#xff0c;画出其运行框图及梯形图控制程序的编制&#xff0c;并画出硬件接线图。 1.2设计参数 1.3控制要求 &#xff08;1&#xff09;按下启动按扭及水位选择开关&#xff0c;开始进水直…

object类教程

Python object 类教程 在 Python 中&#xff0c;object 是所有类的基类。所有 Python 类都隐式或显式地继承自 object。理解 object 类是理解 Python 面向对象编程&#xff08;OOP&#xff09;的关键。它为所有类提供了一些基本的方法和属性&#xff0c;并定义了类的行为和实例…

「51媒体-年中大促」天津有哪些媒体资源-媒体宣传服务公司

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 天津的媒体资源相当丰富&#xff0c;涵盖了报纸、电视、广播、新闻门户网站、央媒驻天津机构、视频媒体以及全国媒体资源等多个方面。以下是详细的媒体资源分类和具体信息&#xff1a; 一…

嵌入式web 服务器boa的编译和移植

编译环境&#xff1a;虚拟机 ubuntu 18.04 目标开发板&#xff1a;飞凌OKA40i-C开发板&#xff0c; Linux3.10 操作系统 开发板本身已经移植了boa服务器&#xff0c;但是在使用过程中发现POST方法传输大文件时对数据量有限制&#xff0c;超过1M字节就无法传输&#xff0c;这是…

嵌入式linux获取RGB图片不清晰问题

1.RGB摄像头都是同一个厂家的usb接口的摄像头&#xff0c;接入我们设备上面&#xff0c;应用层通过v4l2框架获取到的JPEG图片不清晰&#xff0c;应用层没有对图片做任何转换&#xff0c;也尝试过获取YUV图片&#xff0c;依然不清晰。 2.相同的USB摄像头&#xff0c;接入windows…

Java 面试题篇 Sleep()方法与Wait() 方法的区别

在 Java 中&#xff0c;sleep() 和 wait() 方法都可以用来控制线程的执行顺序或等待特定条件的发生&#xff0c;但它们有着不同的使用场景和行为&#xff1a; 1. sleep() - sleep() 方法来自于 Thread 类&#xff0c;用于让当前线程暂停执行一段时间&#xff0c;以毫秒为单位。…

Nginx-Rewrite

1、Rewrite的定义 rewrite功能就是使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在 server { }, location { }, if { }中&#xff0c;并且只能对域名后边的除去传递的参数外的字符串起作用。 例如location…

进阶必看,3种灵活操作PyTorch张量的高级方法

大家好&#xff0c;在PyTorch中进行高级张量操作时&#xff0c;开发者经常面临这样的问题&#xff0c;如何根据一个索引张量从另一个张量中选取元素。 例如有一个包含数千个特征的大规模数据集&#xff0c;需要根据特定的索引模式快速提取信息。本文将介绍三种索引选择方法来解…

评估 RAG?只要大模型框架 LlamaIndex 就足够了

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

matlab编写微分方程椭圆型方程(一维形式)

文章目录 理论编程实例原代码 理论 椭圆型方程一维格式即常微分方程&#xff0c;边值问题&#xff0c;方程如下所示&#xff1a; 截断误差&#xff1a; 当 h → ∞ h\rightarrow\infty h→∞时&#xff0c;截断误差趋于零&#xff0c;离散方程组成立&#xff0c; 写成矩阵&…

鸿蒙小案例-短视频

参加泡泡玛特写了个小demo,然后给它稍微完善了一下 基于API11 演示效果 hfvideo演示视频 主要功能集中在4个tab页内 1.首页-视频播放页 2.朋友-关注、朋友、粉丝聚合 3.消息-聊天列表 4.我的-当前用户信息展示 主页页面 1.用户主页 2.聊天页面 3.朋友页面 4.视频播放页 因为不…

Clickhouse集群_ 双副本配置下Replicatedmergetree引擎的表在一个节点被删除后会自动恢复吗

2分片双副本的配置&#xff1a;1,2,3,4节点&#xff0c;分片1落在1,2节点, 1,2节点互为对方的副本&#xff0c;分片2落在3,4节点, 3,4节点互为对方的副本 replicatedmergetree引擎的表在一个节点被删除后&#xff0c;虽然另一个节点还有它的副本&#xff0c;但是这个副本不过同…