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

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的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.mfbz.cn/a/803562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…

Ambari Hive 创建函数无权限

作者&#xff1a;櫰木 1、创建udf函数 参考文档&#xff1a;https://blog.csdn.net/helloxiaozhe/article/details/102498567 如果已经编写好&#xff0c;请使用自己的。如果没有请参考以上链接进行udf函数编写。 2、创建函数遇到的问题 由于集群开启了kerberos&#xff0…

常用的点云预处理算法

点云预处理是处理点云数据时的重要部分&#xff0c;其目的是提高点云数据的质量和处理效率。通过去除离群点、减少点云密度和增强特征&#xff0c;可以消除噪声、减少计算量、提高算法的准确性和鲁棒性&#xff0c;从而为后续的点云处理和分析步骤&#xff08;如配准、分割和重…

[超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动+CUDA+cuDNN+Pytorch)--[3]安装cuDNN与Pytorch

本次配置过程的三篇博文分享分别为为&#xff1a; [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[1]安装显卡驱动 [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[2]安装Anaconda与CUDA [超级详细系列]ubuntu22.04配置深…

使用windows批量解压和布局ImageNet ISLVRC2012数据集

使用的系统是windows&#xff0c;找到的解压命令很多都linux系统中的&#xff0c;为了能在windows系统下使用&#xff0c;因此下载Git这个软件&#xff0c;在其中的Git Bash中使用以下命令&#xff0c;因为Git Bash集成了很多linux的命令&#xff0c;方便我们的使用。 ImageNe…

Python: 一些python和Java不同的基础语法

文章目录 1. 数据类型2. 字符串的引用3. 字符串拼接4. Python中的报错5. Python中的输入语句(input)6. 运算符(**和//)7. 除法运算8. 注释方法: #或者三引号9. Python中的比较10. Java中用and, or, not代替逻辑运算符11. 多元赋值12. Python不支持自增自减操作13. 在Python中, …

jenkins 使用教程

1. 安装最新长期稳定版 2.426.1 Redhat Jenkins Packages sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum insta…

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

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

python课设——宾馆管理系统

python课设——宾馆管理系统 数据库课设-宾馆管理系统-python3.7pyqt5 简介 大二数据库课程设计&#xff08;3-4天工作量&#xff09;的项目&#xff0c;登录界面的ui设计参考了他人成果&#xff0c;其余ui以及所有后端部分全部独立完成&#xff0c;详细功能见功能模块图使用…

简单实现一个本地ChatGPT web服务(langchain框架)

简单实现一个本地ChatGPT 服务&#xff0c;用到langchain框架&#xff0c;fastapi,并且本地安装了ollama。 依赖安装&#xff1a; pip install langchain pip install langchain_community pip install langchain-cli # langchain v0.2 2024年5月最新版本 pip install bs4 pi…

Unity | Shader基础知识(第十八集:Stencil应用-透视立方盒子)

目录 一、前言 二、场景布置 三、 shader部分 1.图片的部分 2.图片部分纯净代码 3.遮罩部分复习 4.深度写入 ZWrite 5.颜色遮罩ColorMask 6.遮罩纯净代码 四、场景中shader使用 五、作者的碎碎念 一、前言 因为这个内容稍微有点多&#xff0c;我尽力讲清楚了&#x…

速部署 HBase 测试环境

快速部署 HBase 测试环境 第一步&#xff1a;下载软件&#xff0c;在HBase官网下载最新版&#xff0c; 找到 bin&#xff0c;点击下载&#xff0c;比如我这里下载的是 hbase-2.5.6-bin.tar.gz 第二步&#xff1a;解压软件 $ tar -zxvf hbase-2.5.6-bin.tar.gz $ cd hbase-2.…

业务终端动态分配IP-DHCP技术、DHCP中继技术

一、为什么需要DHCP? 1、许多设备(主机、无线WiFi终端等)需要动态地址的分配; 2、人工手工配置任务繁琐、容易出错,比如:IP地址冲突; 3、网络规模扩大、复杂度提高,网络配置越来越复杂,计算机的位置变化和数量超过可分配IP地址的数量,造成IP地址变法频繁以及IP地址…

微信小游戏 彩色试管 倒水游戏 逻辑 (四)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义了一个名为 WaterFlow class&#xff0c;该类继承自 cc.Graphics&#xff0c;用于在 Cocos Creator 中创建和显示水流的动画效果。下面是对代码的详细解释&#x…

FPGA FIR fdatool filter designer MATLAB

位数问题 fdatool 先确定输入信号的位宽&#xff0c;比如17位在fdatool中&#xff0c;选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意&#xff1a; 当设置输入位宽为16位时&#xff0c;ip核…

智能手术新时代:Apple Vision Pro在医疗领域的突破性应用

无人驾驶的未来&#xff1a;AI如何重塑我们的出行世界-CSDN博客文章浏览阅读2.2k次&#xff0c;点赞109次&#xff0c;收藏64次。无人驾驶汽车的发展是AI技术应用的一次伟大尝试。特斯拉与百度“萝卜快跑”在这个领域的竞争与合作&#xff0c;不仅展示了AI技术的强大潜力&#…

记录些MySQL题集(6)

MySQL 单表为什么不要超过 2000W 行&#xff1f; 数据持久化在磁盘中&#xff0c;磁盘的最小单元是扇区&#xff0c;一个扇区 0.5 KB&#xff0c;而由 8 个扇区可以构成一个文件系统块&#xff08;4K&#xff09;&#xff0c;以 InnoDB 存储引擎为例&#xff0c;一个数据页的大…

React Native 自定义 Hook 获取组件位置和大小

在 React Native 中自定义 Hook useLayout 获取 View、Pressable 等组件的位置和大小的信息 import {useState, useCallback} from react import {LayoutChangeEvent, LayoutRectangle} from react-nativeexport function useLayout() {const [layout, setLayout] useState&l…

MySQL数据库查询索引失效场景

在连表情况下,如果排序字段涉及到了两个表,排序字段将无法走索引. 加上第二个排序字段之后,走全表扫描了. 或者尽量让两次排序都用同一个表的字段,这样可以建联合索引让排序也能走索引.&#xff08;不想建联合索引的话&#xff0c;可以第二次排序用表id&#xff0c;这样单个的…

《昇思25天学习打卡营第25天|第10天》

今天是打卡的第十天&#xff0c;今天开始学应用实践中的LLM原理和实践&#xff0c;今天学的是基于MindSpore实现BERT对话情绪识别。最先了解的是BERT模型的简介&#xff08;来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&…