c++基础 面向对象:第四篇 (类和对象-封装)

2023-11-05

类和对象

c++面向对象的三大特性:封装,继承,多态
在c++中,认为万物皆对象,对象有属性和行为

在这里插入图片描述

类和类的实例化

在c++中,用关键字 class 去封装对象。
语法:

class 类名
{
	//1.属性
	//2.行为
}

属性我们又叫成员变量,成员属性。
行为我们又叫成员函数,成员方法。叫法不同但是都是一个意思。
创建一个对象又叫实例化对象。
由于 class定义出来的对象并不是一个对象,是千千万万个相同属性和行为方法的对象,所以我们抽象出来这个类名,用类名去创建一个具体的对象

看一个例子感受以下类:
设计一个圆,求其圆的周长

//圆周率
const double PI = 3.14;
//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{
public:  
	//属性
	int m_r;//半径
	
	//行为
	//获取到圆的周长
	double calculateZC()
	{
		return  2 * PI * m_r;
	}
};

int main() {

	//通过圆类,创建圆的对象
	// c1就是一个具体的圆
	Circle c1;
	c1.m_r = 10; //给圆对象的半径 进行赋值操作
	
	//2 * pi * 10 = = 62.8
	cout << "圆的周长为: " << c1.calculateZC() << endl;
	system("pause");
	return 0;

设计了一个圆类 Circle,用圆类创建了一个对象 c1;这个对象拥有了圆类 Circle 属性和方法。如何使用Circle 的属性和方法呢?用 对象.属性对象.行为即可。


用类类型创建对象的过程,称为类的实例化

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量;
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间;

访问权限

在设计类时候,可以给成员变量和成员函数加以权限的设定,来设定他们的访问。
在c++中访问权限有三种:

public:共有权限。类内可以访问,类外可以访问。
private: 私有权限。类内可以访问,类外不可以访问。
protect: 保护权限。类内可以访问,类外不可以访问。
访问:就是对该变量和方法进行读写或者其他一些操作。

private和protect的区别:private的成员变量和方法只有自己类可以访问,但是protect的成员变量和方法父类也可以访问。


c++中的class和struct 的区别:
其实没什么区别,在c++中为了兼容c语言,就保留了struct这个关键字,两者的区别就在于class默认权限是私有的,struct默认权限是共有的。


成员属性私有化

在c++中,成员属性一般设置为private的权限:
这样你可以在类内读和写自己的成员变量。
可以检查写入时候的数据有效性。
那问题来了,你把成员属性设置为pivate,外面如何访问你的成员变量呢?可以通过设置一个共有的函数,对外提供接口,通过函数去访问里面的变量。

class Person {
public:

	//姓名设置可读可写
	void setName(string name) {
		m_Name = name;
	}
	string getName()
	{
		return m_Name;
	}


	//获取年龄 
	int getAge() {
		return m_Age;
	}
	//设置年龄
	void setAge(int age) {
	//检测写入数据的有效性
		if (age < 0 || age > 150) {
			cout << "你个老妖精!" << endl;
			return;
		}
		m_Age = age;
	}

	//情人设置为只写
	void setLover(string lover) {
		m_Lover = lover;
	}

private:
	string m_Name; //可读可写  姓名
	
	int m_Age; //只读  年龄

	string m_Lover; //只写  情人
};


int main() {

	Person p;
	//姓名设置
	p.setName("张三");
	cout << "姓名: " << p.getName() << endl;

	//年龄设置
	p.setAge(50);
	cout << "年龄: " << p.getAge() << endl;

	//情人设置
	p.setLover("苍井");
	//cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取

	system("pause");

	return 0;
}

封装

在c++中,是通过class关键字将成员属性和成员方法封装成为一个类名,对外隐藏数据和实现细节,这个类名就可以被当成一个数据类型去创建对象了,这样的好处有很多:不让外界访问数据,只给访问必要的接口,减少很多不必要的错误。
比如一个栈的类的设计,你top指针可以有两种设计方式,第一种是一开始指向下标0,第二种一开始指向下标1;假如你不清楚这个类的top指针设计方式,去通过访问top指针得到栈顶元素,那么就很容易出错,得不到你想要的结果;
假如数据被保护了,只提供接口,那么就好很多了,因为接口都是完成一样的功能,比如说top()接口,获取栈顶元素,此时,你不需要再访问数据top指针,直接调用接口就可以得到你要的栈顶元素了;这样减少了不必要的错误发生;
封装体现在两个方面:

  1. 数据和方法封装在一起;
  2. 访问限定符对数据和方法的访问限制外界的访问;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++基础 面向对象:第四篇 (类和对象-封装) 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • 为什么 __dict__ 和 __weakref__ 类从未在 Python 中重新定义?

    类创建似乎从来没有re 定义 dict and weakref class属性 即 如果它们已经存在于超类的字典中 则它们不会添加到其子类的字典中 但始终re 定义 doc and module class属性 为什么 gt gt gt c
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 在ch32v307单片机上移植LUA

    下载lua源代码 先到官网下载lua源代码 http www lua org 然后解压出源码 源码移植 这里基于官方例程中的串口例程进行移植 USART Printf例程 使用MounRiver Studio该工程 然后添加lua源码 需要
  • 说说对 Node 中的 Buffer 的理解?应用场景?

    一 是什么 在Node应用中 需要处理网络协议 操作数据库 处理图片 接收上传文件等 在网络流和文件的操作中 要处理大量二进制数据 而Buffer就是在内存中开辟一片区域 初次初始化为8KB 用来存放二进制数据 在上述操作中都会存在数据流动
  • Android Studio 安装 SDK 失败

    https blog csdn net zdw wym article details 74942772 utm source tuicool utm medium referral
  • 计算机端口详解

    计算机端口详解 一 摘要 端口是个网络应用中很重要的东西 相当于 门 了 二 什么是端口 在 Internet上 各主机间通过TCP TP协议发送和接收数据报 各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择 可见 把数据报顺
  • 【C语言】如何只打印小数的有效数字位数且不补0

    我们时常会碰到使用printf打印小数但只想显示该小数有有效数字的小数位数 这时使用float或者double类型打印时往往会出现以下情况 但是如果我们不想打印39 5之后的小数 那么就需要将c语言中printf语句中的 f 表示十进制浮点
  • pipreqs——快捷生成一个Python项目的依赖模块requirements.txt

    依赖模块文件快捷生成requirements txt 解决代码复用过程中 低效环境配置的问题 使用步骤 1 安装pipreqs pip install i https pypi tuna tsinghua edu cn simple pip
  • Tomcat的优化

    Tomcat作为一款常用的web容器 对其进行优化是提升性能的重要手段 对其进行优化可以从以下方面入手 调整内存 调整线程池 Executor 调整连接器 Connector 调整运行模式 调整内存 如果内存设置过小 极有可能导致项目无法启
  • 头条移动端项目Day07 —— app端文章搜索

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 app端文章搜索 1 本章内容介绍 1
  • 通过图数据库 Neo4J 建立疫情行动轨迹及接触关系图

    最近疫情反复 我被为拜托建一张 某某行动轨迹及接触关系图 这类行动轨迹或接触关系 可以抽象成网或者图 从这类图结构立刻就会联想到图数据库Neo4J 正好并没有在公司电脑上安装和使用过Neo4J 于是在这里简单记录下 整个过程还是非常简单的
  • 硅谷撑不住了?200多家美国科技公司裁员1.8万人

    点击上方 AI遇见机器学习 选择 星标 公众号 重磅干货 第一时间送达 疫情之下 硅谷巨头们快撑不住了 据Layoffs fyi称 自3月初以来 美国科技公司迎来多次大规模的裁员 自新冠病毒在欧美肆虐以来 Layoffs fyi一直在追踪初
  • windows下游戏服务器端框架Firefly安装说明及demo运行

    本来公司一个网游服务器端选定了pomelo框架 后来出了个Firefly 为做一个对比 决定研究一下Firefly 看了一下Firefly 感觉头大 python的 本人python小白 只好慢慢折腾 一天下来总算装上了Firefly框架
  • android:layout_weight的真实含义

    首先声明只有在Linearlayout中 该属性才有效 之所以android layout weight会引起争议 是因为在设置该属性的同时 设置android layout width为wrap content和match parent会
  • SimSwap代码精析对应论文Pipeline【Identity Extractor以及loss的计算,Encoder,ID Injection Module,Decoder】

    SimSwap代码精析对应论文Pipeline Identity Extractor以及loss id的计算 Encoder ID Injection Module Decoder 0 前言 1 先看Inference的Pipeline I
  • leetcode 14-最长公共前缀 python

    编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 1 输入 flower flow flight 输出 fl 示例 2 输入 dog racecar car 输出 解释 输入不存在公共前缀 可以使用enu
  • K阶斐波那契数列--------西工大NOJ习题.10

    K阶斐波那契数列 西工大NOJ习题 10 原创不易 转载请说明出处 科普 k阶斐波那契数列的0到n 1项需要有初始值 其中 0到n 2项初始化为0 第n 1项初始化为1 在这道题目中 所引用的函数详见 数据结构实现 循环队列 我的一篇博文
  • 找不到模块“../views/HomeView.vue”或其相应的类型声明。

    找不到模块 views HomeView vue 或其相应的类型声明 我们再新建项目中可以看到这个文件 这个时候我们再里面添加这段代码 declare module vue import App defineComponent from v
  • el-date-picker 的时间范围跨度设置

  • 嵌入式基于linux电机控制器,基于嵌入式Linux的移动机器人控制系统

    使用select机制监控是否语音识别结果 在超出等待时间后 会退出等待并重新初始化语音模块LD3320 释放公共资源 这样也使得系统能够及时响应LD3320的MP3播放功能 避免了在长时间没有语音识别结果时 系统进入卡死状态 本文引用地址
  • 在CentOS系统上安装Redis

    以下是在CentOS系统上安装Redis的步骤 1 升级系统 sudo yum update 2 添加EPEL库 sudo yum install epel release 3 安装Redis sudo yum install redis
  • c++基础 面向对象:第四篇 (类和对象-封装)

    文章目录 类和对象 类和类的实例化 访问权限 成员属性私有化 封装 类和对象 c 面向对象的三大特性 封装 继承 多态 在c 中 认为万物皆对象 对象有属性和行为 类和类的实例化 在c 中 用关键字 class 去封装对象 语法 class