[C++] 二 类、对象、封装

news/2024/11/23 17:13:20/

类与对象:

类:一种抽象的概念,其内部是对某些行为和属性的总结

对象:根据类这个概念创造出来的实体,一个对象必然有一个类

需要注意的是,一定是先有类,再创建出这个类的对象;在学习static关键字之前,如果只有类没有 这个类的对象,这样的类没有意义

类的内容:类分为行为(成员函数)和属性(成员变量、数据成员)

类的内容主要通过行为和属性组成,行为是能做的事,通常使用函数来表示,也就是成员函数;

属性是存储的数据,通常称为成员变量

成员函数与成员变量统称为成员变量

//以手机为例:
class MobilePhone
{
public:   //公有权限:没有任何访问限制string brand; //品牌(属性)string model; //型号(属性)int weiget;   //重量(属性)void communicate() //通信(行为){cout << "可以通信" << endl;}void run_game() //运行游戏(行为){cout << "总有地上的生灵敢于直面雷霆的威光" << endl;}void play_music() //播放音乐(行为){cout << "只因你太美" << endl;}
};

实例化对象

对象的创建也被称为实例化,一个类只有创建了对象之后才有实体。

对象在C++中有两类:

1、栈内存对象

创建不使用任何关键字,在其生命周期(所在的{})结束后,自动被销毁

2、堆内存对象

创建使用new关键字,销毁使用delete关键字,不会自动销毁。堆内存对象使用指针进行保存

//接上面代码:
int main()
{//栈内存对象MobilePhone mp1; //调用属性mp1.brand = "8848钛金手机"; mp1.model = "A99 PULS MAX";mp1.weiget = 150;cout << mp1.brand << " " << mp1.model<< " " << mp1.weiget << endl;//调用成员函数mp1.communicate();mp1.play_music();mp1.run_game();//堆内存对象MobilePhone* mp2 = new MobilePhone;mp2->brand = "菠萝手机";mp2->model = "fandX800";mp2->run_game = 50;cout << mp2->brand << " " << mp2->model<< " " << mp2->weiget << endl;mp2->communicate();mp2->play_music();mp2->run_game()//手动销毁,销毁之后不要再使用delete mp2;mp2 = NULL;cout << "主函数结束" << endl;return 0;
}

delete之后的对象不要再使用,也不要使用delete关键字修饰栈内存对象。

堆内存对象如果忘记delete会造成内存无法释放,这种现象称为“内存泄漏”

封装

前面写的类特别像一个结构体,那是因为一个完全开放的类就是结构体。

class和struct的区别:class默认权限是私有属性,struct默认权限是公有属性

这样的类所有细节都暴露在外面,不符合面向对象的特性

面向对象的三大特性:封装、继承、多态

封装是指将一些属性和其他细节隐藏,重新提供给外部调用的接口。类似于测试中黑白盒子的概念

封装的三种权限:public:公共权限、private:私有权限、protected:保护权限

公共权限:所有成员都可访问

私有权限:在这个类的类内能访问但是在类外不能访问,如果我们要访问被设置为私有权限的属性,只能在public中设置一个成员函数去访问被设置为私有权限的属性,这个函数就是对外的接口

保护权限:和私权限很相似,但保护权限的子类是能访问protected的属性和行为,但私有权限的子类不能

提供给外部访问的隐藏属性的接口通常分为两种:

setter:用于写入属性值

getter:用于读取属性值

通过这两类公开接口对属性的读写权限分离控制

class MobilePhone
{
private:string brand = "山寨";string model = "8848";int weight = 666;public:string get_brand() // 只读{return brand;}void set_weight(int w) // 只写{weight = w;}string get_model() // 可读{return model;}void set_model(string m) // 可写{model = m;}void show(){cout << brand << endl;cout << model << endl;cout << weight << endl;}
};int main()
{MobilePhone mp1;mp1.show();mp1.set_model("14");mp1.set_weight(233);cout << mp1.get_brand() << " " << mp1.get_model() << endl;return 0;
}


http://www.ppmy.cn/news/709292.html

相关文章

2019,我们被“黑”科技薅过的羊毛?

14秒破10亿。 1分36秒破100亿。 1小时3分59秒破1000亿。 …… 在刚刚过去的双十一&#xff0c;天猫不经意间又创造出一组让人叹为观止的数字。 有人感慨国人购买力之恐怖。也有人感怀直播带货之疯狂。有人忙着盘算自己贡献出多少GDP。也有人庆幸自己一觉醒来居然错过了上千…

阿里巴巴中间件之Nacos

一.Nacos是什么&#xff1f; Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中…

SpringCloud初体验

SpringCloud初体验 以一次我们实验室承接的国家级项目实践开发为契机&#xff0c;搞了一点 SpringCloud 相关的微服务系统架构&#xff0c;在此分享。相关的代码我贴在了自己的 Gayhub 上&#xff0c;有需要的话欢迎自取 Presented By AlbertoWang SpringCloud 可能会涉及到一…

Spring学习(7)-AOP面向切面编程

1 AOP 1.1 AOP是什么 如果说 IoC 是 Spring 的核心&#xff0c;那么面向切面编程就是 Spring 最为重要的功能之一了&#xff0c;在数据库事务中切面编程被广泛使用。 AOP即 Aspect Oriented Program 面向切面编程&#xff0c;它将业务逻辑的各个部分进行隔离&#xff0c;使开…

Spring学习(8)-AOP之ProxyFactoryBean、RegexMethodPointcutAdvisor、BeanNameAutoProxyCreator

前言&#xff1a; 上一篇学习了Spring AOP&#xff08;面向切面编程&#xff09;的基础&#xff0c;在Spring Bean 的配置文件中代理工厂ProxyFactoryBean 的写法似乎并没有见到切入点(pointcut)&#xff0c;切面(aspect)&#xff0c;织入(weaving)等等的英文所在&#xff0c;那…

服务注册与配置中心(Nacos)

文章目录 1、概述①、什么是Cloud Alibaba②、Cloud Alibaba能干什么③、什么是Nacos④、Windows安装NacosⅠ、下载Ⅱ、修改相关配置Ⅲ、运行测试 ⑤、Docker安装Ⅰ、拉取镜像Ⅱ、启动容器Ⅲ、访问测试 ⑥、引入Cloud Alibaba 依赖坐标 2、Nacos做服务注册中心①、第一个服务提…

Day9-SpringCloud alibaba服务注册与配置中心Nacos

学习自尚硅谷&#xff1a;学习地址 欢迎━(&#xff40;∀)ノ亻!大家去一键三连 周阳老师讲的真的很好&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#x1f923;&#x1f923;&#x1f923; [toc] SpringCloud alibaba 服务限流降级…

小罐茶背后的男人:“包办”了我的童年少年中年……

中新网客户端北京1月18日电(记者 吴涛)“小学穿他的背背佳&#xff0c;中学用他的好记星&#xff0c;大学买了E人E本&#xff0c;工作第一桶金给老父亲买了一台8848手机&#xff0c;现在谈生意跟客户喝的是小罐茶。” 很多80后都有这样的生活经历&#xff0c;但没想到的是&…