【C++】类和对象的基本概念与使用

news2024/11/15 11:09:37

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C++中的类的定义方式,并提出了一些注意事项,最后描述了类的大小的计算方法。


一、什么是面向对象?

1.面向对象的概念

面向对象(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和操作数据的方法封装在对象(Object)中,以提高代码的重用性和可维护性。面向对象编程的核心概念包括:

  1. 对象(Object)对象是类的实例,包含数据和方法。数据通常被称为属性或字段,方法则是能够操作这些数据的函数。
  2. 类(Class)类是对象的蓝图或模板,定义了对象的属性和方法。通过类可以创建多个对象。
  3. 封装(Encapsulation):将数据和操作数据的方法封装在对象中,并对外界隐藏对象的内部实现细节。通过提供公开的方法(接口)来操作对象的数据。
  4. 继承(Inheritance):一个类可以继承另一个类的属性和方法,从而实现代码重用。继承使得子类可以扩展父类的功能。
  5. 多态(Polymorphism):多态允许不同类的对象可以通过相同的接口调用,具体调用的 实现根据对象类型的不同而不同。这使得程序具有更好的灵活性和可扩展性。

2.面向对象的简单例子

█ 类(Class)

可以想象成一个蓝图或模板。例如,我们要创建一辆车,那么“车”就是一个。这个类包含了所有车共有的属性,比如颜色、品牌、型号等,还有车能做的事情,比如启动、加速、刹车等。

█ 对象(Object)

是根据类创建的具体实例。比如,根据“车”这个类,我们可以创建具体的车:一辆红色的特斯拉,一辆蓝色的宝马等。每辆车都是一个对象,它们都有各自的颜色、品牌等属性,但它们都是从“车”这个类创建出来的

█ 封装(Encapsulation)
把车的属性(比如颜色、品牌)和行为(比如启动、加速)封装在一起,就像把这些东西装在一个盒子里。外面的人只能通过车提供的功能(比如按下启动按钮)来与车互动,而不需要知道车内部是怎么工作的。

█ 继承(Inheritance)
如果我们有一个“电动汽车”类,它可以继承“车”类的所有属性和行为,并且添加一些自己的特性,比如电池容量。这就像是你有了一个标准车的模板,然后在这个基础上进行扩展,增加一些新的功能。

█ 多态(Polymorphism)
多态让不同类型的车在调用相同的“启动”方法时表现不同。比如,对于一辆传统汽车,启动可能是点火;而对于电动汽车,启动可能是激活电池。尽管调用的都是同一个“启动”方法,但具体的行为是根据车的类型来决定的。

3.面向对象VS面向过程

        面向过程(Procedural Programming)是一种编程范式,它主要通过过程(函数或方法)的调用来解决问题,程序的执行是按照一系列步骤顺序进行的。

        C语言是面向过程的语言,而C++是面向对象的语言。

        如果我们要用程序思维解析洗衣服这一行为。面对过程的编程需要倒入水、导入洗衣粉、清洗衣物、拧干...等一系列的函数,然后使用者一一调用这些函数,而面向对象就像一个洗衣机,他将洗衣服的这些方法和对象糅合在一个类里,使用者只要拿一些衣物放入洗衣机就可以直接完成这一行为。


二、类的简单使用

1.结构体与类

        结构体和类是没有什么直接的关系的,但是他们还是有一些相似之处。

        在C语言中,结构体可以将不同类型的数据结合在一起,可以描述数据成员的属性但是不能有方法(函数)存在,否则就会报错。

C语言文件,结构体包含函数编译无法通过

        而C++是兼容C语言的,C++中仍然有结构体这个概念,C语言文件中能够运行的它都可以执行,但是C++中的结构体有一些扩展,使得其与类非常的相似。

C++文件中,结构体可以添加函数(方法)

2.结构体——>类

1)struct——>class

        想要从结构体转变为类,首先需要将前面的修饰struct改为class

2)访问限定符

①定义

在C++中,访问限定符(Acess Specifiers)用于控制类或者结构体成员的访问权限。一共有三个,分别为public(公开访问,任何地方都可以访问) 、protected(保护访问,只有类本身、友元和派生类可以访问)、plivate(私有访问,只有类本身和友元可以访问,派生类无法访问)。

(成员声明为public后,这些成员可以从类的外部直接访问,这通常用于类的接口部分。)

②使用
class date
{
	public:
		void print_d()
		{
			cout << year << "年" << month << "月" << day << "日" << endl;;
		}
	private:
		int _year;
		int _month;
		int _day;
};
③注意事项☆
  • 类定义的惯例:成员变量一般都设为私有(而且内部的变量一般都会在前面稍加修饰,如_year
  • 访问权限作用域从该访问限定符出现的位置直至下一访问限定符出现或到类体结束为止
  • class的默认访问权限为private,struct为public
  • 访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。(访问限定符只是在编译期间进行访问控制,防止在代码中不正确或不安全的访问,但是这些数据在内存上是没有什么差别的)

3.类的定义

class ClsssName
{
    //类体:成员函数和成员变量

public:
    //...成员函数之类的
private:
    //...成员变量

};  //;不能忘
  • 类里定义的函数最好是定义和声明分离,在定义处要指明类域
  • (void class::print_d() {//...} )。默认在类里面定义的是inline(会进行隐式内联)。

4.类的实例化(对象)

        类是一个蓝图,对象就是蓝图的实现,类与对象是一对多的关系。

1.对象的定义

        基于以上的Date类进行实例化:(分别创造了d1,d2和a三个对象)

int main()
{
    Date d1;
    Date d2;
    Date a;
    return 0;
}

   此时d1._year++;d2._year++;是不一样的,它们是两个对象。 

2.类对象的大小

        一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。类并没有占实际的物理空间,是不能直接使用的,但是我们可以描述类的大小,它和对象的大小是一样的。

  • 一个类的大小,实际就是在内存对其的条件下该类中成员变量的大小,因为不同的对象每次调用的函数是一样的,为了避免每次实例化都创建一个新函数,类的成员函数被保存在公共代码段,不算在类的大小中。
  • 一个空类或者只有成员函数的类大小是一个字节。虽然里面没有成员变量,编译器给空类一个字节来唯一标识这个类的对象。

以下是在vs编译器下的大小计算(vs默认对齐数为8)

(内存对齐规则参考博文)

class date
{
private:
	int year;
	int month;
	int day;
public:
	void print_d()
	{
		cout << year << "年" << month << "月" << day << "日" << endl;;
	}
};
//sizeof(date)为12

class A
{
	int _a;
	int* _b;
	short _c;
	float _d;
};
//int4,int*8,short2,float4 sizeof(A)为24

class B
{
	void func();
};
//sizeof(B)为1

class D
{
	class E{};
};
//sizeof(D)为1

-The End- 

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

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

相关文章

解决一下git clone失败的问题

1&#xff09;.不开梯子&#xff0c;我们用https克隆 git clone https://github.com 报错&#xff1a; Failed to connect to github.com port 443 after 2091 ms: Couldnt connect to server 解决办法&#xff1a; 开梯子&#xff0c;然后# 注意修改成自己的IP和端口号 gi…

自适应巡航控制中的Stop Go功能详解

自适应巡航控制中的跟车行驶功能详解 文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例6. 总结与展望 1. 背景介绍 自适应巡航控制&#xff08;Adaptive Cruise Control, ACC&#xff09;系统中的Stop & Go功能是提升驾驶舒适性和安全性的重要子…

Qt Splash样式的登录窗

Qt Splash样式的登录窗实现 目录 0 结果 1. 设计界面 2.鼠标拖动界面 3. 密码MD5加密 4. 保用户名和密码到注册表 0 结果 1. 设计界面 继承自QDialog&#xff0c;图片使用QLabel加载&#xff0c;windowFlag样式为 Qt::SplashScreen TLoginForm::TLoginForm(QWidget *pa…

PPOCR训练后acc为0解决方法

首先你需要先配置PPOCR源码和环境&#xff0c;可以按照如下流程 PPOCR训练和C#部署英文字符训练_ppocrlabel可以终端运行吗-CSDN博客 训练时如下 如下是rec训练模型 acc为0 det也是如此 如下没有 名为best的模型文件 解决办法就是 将如下的train和eval部分的batch_siz…

挂耳式蓝牙耳机什么牌子好?这五款综合表现遥遥领先

为什么这几年开放式耳机受到了越来越多消费者的喜爱&#xff1f;我想是因为它全方位的弥补了入耳式耳机堵塞耳朵、不够安全健康的缺陷&#xff0c;真正做到了安全性与舒适性兼得。那么刚入坑开放式耳机的小白该如何挑选一款品质较高的开放式耳机呢&#xff1f;挂耳式蓝牙耳机什…

第59期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Python酷库之旅-第三方库Pandas(027)

目录 ​一、用法精讲 68、pandas.infer_freq函数 68-1、语法 68-2、参数 68-3、功能 68-4、返回值 68-5、说明 68-6、用法 68-6-1、数据准备 68-6-2、代码示例 68-6-3、结果输出 69、pandas.interval_range函数 69-1、语法 69-2、参数 69-3、功能 69-4、返回值…

JVM--HostSpot算法细节实现

1.根节点枚举 定义&#xff1a; 我们以可达性分析算法中从GC Roots 集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots 的节点主要在全局性的引用&#xff08;例如常量或类静态属性&#xff09;与执行上下文&#xff08;例如 栈帧中的本地变量表&a…

硬件开发笔记(二十六):AD21导入电感原理图库、封装库和3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140437290 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

NDK R25b 交叉编译FFMpeg4,项目集成,附库下载地址

1.准备工作 文件下载&#xff1a; NDK R25b下载地址&#xff1a;Android NDK历史版本下载网址 - 君*邪 - 博客园 (cnblogs.com) FFmpeg4.4.4 下载地址&#xff1a;https://ffmpeg.org/releases/ffmpeg-4.4.4.tar.xz 环境配置&#xff1a; 本次编译环境是在PC虚拟机中使用U…

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 &#xff08;1&#x…

Oracle线上执行SQL特别慢的原因分析

一、背景&#xff1a; 线上反馈一张表select * from table where idxxx语句执行特别慢&#xff0c;超过60s超时不能处理&#xff0c;第一直觉是索引失效了&#xff0c;开始执行创建索引语句create index index_name on table() online。但是执行了超过20分钟索引还没有创建成功…

NestJs框架getRepository方法废弃解决办法,顺便介绍一下typeORM框架

报错&#xff1a; Connection "default" was not found. ... ...因为 typeorm 版本不对&#xff0c;这是旧版的 api, 可以考虑降版本到 <0.3.0 解决 介绍一下 typeORM 我们如果直接使用 Node.js 操作 mysql 提供的接口&#xff0c; 那么编写的代码就比较底层&a…

彩电上自带的推箱子游戏是什么编程语言开发的?

2000年左右的厦新彩电上&#xff0c;自带了推箱子、华容道游戏。界面如下&#xff1a; 在线版推箱子游戏&#xff0c;网址&#xff1a;https://www.tuixiangzi.cn/ BASIC&#xff0c;全称是Beginners All-purpose Symbolic Instruction Code&#xff0c;含义是初学者通用符号…

Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

title: Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验 date: 2024/7/16 updated: 2024/7/16 author: cmdragon excerpt: 摘要&#xff1a;“Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验”介绍如何使用useHead函数…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥别名集(ArkTS)】

查询密钥别名集(ArkTS) HUKS提供了接口供应用查询密钥别名集。 开发步骤 初始化密钥属性集。用于查询指定密钥别名集TAG&#xff0c;TAG仅支持HUKS_TAG_AUTH_STORAGE_LEVEL。调用接口[listAliases]&#xff0c;查密钥别名集。 HarmonyOS与OpenHarmony鸿蒙文档籽料&#xff1…

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…

【Linux 配置静态IP】Ubuntu20.04

最近学习网络编程&#xff0c;为了方便学习需要Ubuntu配置静态IP&#xff0c;网上看了好多贴子跟着试了下可以实现&#xff0c;但重启虚拟机后有时就无法连接&#xff0c;总之各种各样问题&#xff1b;相关的配置方法也比较凌乱&#xff0c;有用netplan 或者 ifupdown ,笔者简单…

【日常记录】【插件】excel.js 的使用

文章目录 1. 引言2. excel.js2.1 创建工作簿和工作表2.2 excel文件的导出2.3 excel文件的导入2.4 列2.5 行2.6 添加行2.7 单元格2.8 给总价列设置自动计算(除表头行) 3. 总结参考链接 1. 引言 前端导出excel文件常用库一般是 excel.js 和 xlsx.js xlsx.js 导出数据确实方便&…

函数定义、合约与面向对象(以太坊solidity合约)

函数定义、合约与面向对象&#xff08;以太坊solidity合约&#xff09; 1-函数定义、构造与多态2-事件日志3-面向对象特征 1-函数定义、构造与多态 创建合约就是创建类&#xff0c;部署合约就是实例化 合约的方法还支持多态 还能使用第三方的库进行开发 整个合约部署后&…