C++从入门到入土(二)——初步认识类与对象

目录

前言

类与对象的引入

类的定义

类的访问限定符及封装

访问限定符:

封装:

类的作用域

类的实例化

类的大小

this指针

this指针的特性


前言

各位佬们,在开始本篇文章的内容之前,我想先向大家道个歉,由于最近学习任务繁重,因此博客更新比较缓慢(实际上是因为我比较懒,哈哈哈)。在上一篇博客,我简单介绍了C++的一些基础知识,而这些基础知识则是为本篇博客打基础的,今天这篇博客则是开始介绍C++的关键部分,类与对象。如果我的博客对您有所帮助的话,希望能够点赞关注加转发,您的支持就是对我创作的最大鼓励。

类与对象的引入

首先我们要明白一点,C++这门语言实际上是在弥补C语言的各种缺陷中逐渐创造出来的一门新的编程语言,因此类与对象这个概念同样是为了弥补C语言在使用上的一些缺陷而引出来的,那么是什么样的缺陷导致要引入这一概念呢?在探讨这个问题之前我想先回顾一下C语言结构体的相关概念,比如我们要描述一个人的信息,我们可以创建一个结构体,里面包含了诸如:姓名、年龄、升高、体重等信息,当我们定义出这些信息后,C语言是通过各种不同的函数去实现这些不同的功能,因此可以这样说:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。通过这样的方式写出来的程序可能会导致这样的问题:比如在一个大型项目中,函数的实现与我们所定义的变量距离太远,那么对于阅读代码的人来说就会很麻烦,代码的可读性就会降低。为了解决这个问题C++提供了一个新的解决方法,就是将变量与函数定义在一起, 以顺序表为例:

typedef int SLDataType;
struct SeqList
{
public:void SeqListInit(struct SeqList*ps){ps->arr = nullptr;ps->capacity = ps->size = 0;}void CheckCapacity(struct SeqList* ps){if (capacity == size){int newcapacity = capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(arr, sizeof(SLDataType) * newcapacity);if (tmp == nullptr){perror("realloc fail");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}}
private:SLDataType* arr;int capacity;int size;
};

C++中用class代替struct。 

类的定义

class+类名+类域。类体中的内容称为类的成员,类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。

类的定义有两种方式,第一种方式是将声明和定义全放在类中;第二种方式是将类的声明放在.h文件中,成员函数定义放在.cpp文件中,一般情况下更采用第二种方式。

类的访问限定符及封装

访问限定符:

观察上述代码,我们可以发现,代码中加入了public和private操作符,这些操作符我们把它叫做访问限定操作符。

C++实现封装的方式是用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。那么为什么要引入访问限定符呢?实际上是为了让代码可读性增加,同时提高代码的安全性。下面我将向大家介绍访问限定操作符的使用说明。

访问限定操作符分为三种:public(公有)、protected(保护)、private(私有)

1.public修饰的成员可以在类外直接被访问

2.protect和private修饰的成员在类外不能被直接访问

3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定操作符为止

4.如果没有访问限定操作符,作用域到}结束

5.class默认访问权限为privatee,struct默认为public(注:因为C++兼容C)

值得注意的是:访问限定符只在编译时有用,当数据映射到内存后,没有访问限定符上的区别

说了这么多,C++中的struct和class的区别是什么呢?

C++兼容C语言,所以C++中的struct可以当成结构体使用,同时C++中的struct也可以用来定义类,和class定义是一样的,区别在于struct定义默认访问权限是public,class定义的类默认访问权限是private。

封装:

C++面向对象有三大特性:封装、继承、多态。在类和对象阶段,我们先来介绍封装。

什么是封装呢?将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。仅仅通过定义来理解显得很晦涩,下面我来举个例子:

封装本质是一种管理,让用户更方便使用类,拿电脑举例,对于电脑这个复杂的设备,机箱里面放了很多东西,如果没有机箱,我们把主板、显卡、电源等全裸露在外面,这样就显得很乱,但是正是因为有了机箱,我们可以把这些东西全放在机箱里面,只提供给用户开机键,显示屏,键盘、鼠标等,这样就很容易实现人机交互,C++也是如此,通过将定义和函数封装在类里面,通过类将数据和操作数据的方法进行有机结合,通过访问权限来隐藏对象内部的实现细节,控制哪些方法可以在类外面直接被使用。

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用:::作用域操作符指明成员属于哪个类域。

类的实例化

用类类型创建对象的过程称为类的实例化。我们在定义类的成员变量时只是做了声明,当我们使用类的成员变量时才会在内存中开辟空间,这个过程就叫类的实例化,即:一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

类的大小

当我们定义出类后,我们该如何计算类对象的大小呢?对象的占用大小只考虑成员变量。对于一个空类来说默认大小为一个字节,对于有函数定义无成员变量的类,默认也是一个字节。对于存在多个成员变量的类而言,遵循结构体内存对齐规则。

结构体内存对齐规则:

1.第一个成员在结构体偏移量为0的地址处

2.其他成员变量要齐到对齐数的整数倍的地址处

对齐数=编译器默认对齐数与该成员大小的较小值(vs中默认对齐数为8)

4.如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍

this指针

在介绍this指针之前,我想先来定义一个日期类:

class Data
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Data d1, d2;d1.Init(2024, 5, 9);d2.Init(2024, 5, 10);d1.Print();d2.Print();return 0;
}

运行结果如下:

观察上述代码,我们发现了一个问题,对于类中定义的两个函数,函数体中没有关于不同对象的区分,那么当d1调用Init函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

事实上,C++中通过引入this指针解决该问题,即:C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象,在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有操作对于用户是透明的,即用户不需要显示写,编译器自动完成。

this指针的特性

1.实参和形参的位置不能显示写,编译器自己加,但可以在类里面使用

2.this指针的本质是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不储存this指针

3.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

总结

本篇本章主要简单介绍了C++中类和对象的定义以及类的一些特性,同时也简单介绍了一下this指针,受限于本人的水平,可能文章中会存在一些问题,欢迎各位指正,同时对您能够耐心看完本文给予真挚的谢意。

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

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

相关文章

linux中进程相关概念(一)

什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;当我们使用gcc xxx.c -o pro进行编译时&#xff0c;产生的pro文件&#xff0c;就是一个程序。 进程是程序的一次运行活动&#xff0c;通俗点就是说程序跑起来了就是进程。 …

利用智能私信软件,快速拓展潜在客户群体

在数字化营销的浪潮中&#xff0c;企业如何快速而有效地触及并吸引潜在客户&#xff0c;已成为一个不可忽视的挑战。随着人工智能技术的不断进步&#xff0c;智能私信软件作为一种新型工具&#xff0c;正逐渐改变着企业的市场拓展方式。本文将探讨如何通过这类软件&#xff0c;…

RBAC 权限设计(五)

序言 本文介绍 RBAC2 模型以及具体的实现方案。本文仅提供实现思路供大家参考&#xff0c;在生产实践中请根据业务场景进行具体设计。 一、RBAC2 模型 RBAC2 是 RBAC&#xff08;基于角色的访问控制&#xff09;模型中的一种&#xff0c;它在 RBAC0 的基础上&#xff0c;对用…

GitHub中Asterank源码python修改成C++(本人python不太会)

GitHub - typpo/asterank: asteroid database, interactive visualizations, and discovery tools 主要目的是在进行多元线性回归的时候将枚举型转换为数值型 python: # # The constants used in calculations for the values of asteroids. ## General constants GENERAL_I…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

引入OSS

前置条件 AccessKey 引入依赖 都是官网上的&#xff1a;https://help.aliyun.com/zh/oss/developer-reference/java-installation?spma2c4g.11186623.0.i16 <!--若是创建项目的时候这个依赖勾选了就不用了--><!--不加启动会报错No active profile set, falling back…

JavaScript之数据类型(2)——复杂类型(object)

object的介绍&#xff1a; 我对于object的理解是和C/C中的结构体一样&#xff0c;是一个自定义的数据类型&#xff0c;我们可以通过多个简单的数据类型来定义一个便于我们使用的新的数据类型。 在网上某佬对于其解释如下&#xff1a; Object类型&#xff0c;我们也称为一个对象…

Windows命令行一键安装、配置WSL的方法

本文介绍在Windows电脑中&#xff0c;通过命令行的方式&#xff0c;快速、方便安装适用于Linux的Windows子系统&#xff08;Windows Subsystem for Linux&#xff0c;WSL&#xff09;的方法。 WSL是由微软开发的一项功能&#xff0c;允许在Windows操作系统上运行Linux发行版系统…

【Linux的文件篇章 - 磁盘文件】

Linux学习笔记---012 Linux之进程程序替换理解1、磁盘文件1.1、文件如何存取的问题1.2、了解磁盘的存储结构1.3、如何找到指定位置的扇区&#xff1f;1.4、对磁盘的存储进行逻辑抽象(了解OS对磁盘这样的硬件设备的抽象与管理) 2、磁盘级文件系统2.1、Linux文件系统特定2.2、文件…

Ansible--Templates 模块 Tags模块 Roles模块

一 Templates 模块 ①Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件&#xff0c;可看作一个编译过的模 板文件&#xff0c;用来产生目标文本&#xff0c;传递Python的变量给模板去替换模板中的标记。 ②在配置文件中&#xff0c;会有一些数据&#xff08;如…

Java毕设之基于SpringBoot的在线拍卖系统

运行环境 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) 系统详细设计 管理员功能模块 管理员登录&#xff0c;管理员通过输入用户名、密码、角色等信…

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题&#xff1a; 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件&#xff0c;设置浮力点&#xff0c;应用水中牵引力。 4、最重要的是需要激活——自动启用。 5、调水波长的地方 双击图片…

FreeRTOS学习 -- 任务相关API函数

一、任务创建和删除API函数 FreeRTOS 最基本的功能就是任务管理&#xff0c;而任务管理最基本的操作就是创建和删除任务。 FreeRTOS的任务创建和删除API函数如下&#xff1a; 1、函数 xTaskCreate() 此函数用来创建一个任务&#xff0c;任务需要 RAM 来保存于任务有关的状…

前端js面试题--从字符串中删除删除注释代码

问题&#xff1a;从字符串中删除删除注释代码 描述&#xff1a; solution(weex,rex # and react\nflutter\nnative ssss !hybrid app, [#, !]) 写一个solution函数清除后面参数数组里面的字符串 打印效果 代码1 思路&#xff1a; 将字符全凡是有去掉标志符号的全部添加\n…

Java_File

介绍&#xff1a; File对象表示路径&#xff0c;可以是文件&#xff0c;也可以是文件夹。这个路径可以是存在的&#xff0c;也可以是不存在的&#xff0c;带盘符的路径是绝对路径&#xff0c;不带盘符的路径是相对路径&#xff0c;相对路径默认到当前项目下去找 构造方法&…

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的校园短期闲置资源置换平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

燃气电力瓶装气行业入户安检小程序开发

我们开发的小区业主入户安检小程序&#xff0c;旨在满足燃气、电力以及其他需要入户安检的行业需求。该程序支持自定义安检项目&#xff0c;实现线下实地安检与线上数据保存的完美结合。在安检过程中&#xff0c;我们可以拍照或录像&#xff0c;以确保安检的透明性和可追溯性&a…

渲染管线中光照的计算

文章目录 渲染管线中光照的计算前言法向量朗伯余弦定律漫反射环境光照镜面光照菲涅尔效应 表面粗糙度光照模型平行光源点光源衰减 聚光灯 渲染管线中光照的计算 前言 首先我们来看一下同一个模型在有光与无光下的区别&#xff1a; 无光&#xff1a; 有光 很明显的感知就是…

加速科技突破2.7G高速数据接口测试技术

随着显示面板分辨率的不断提升&#xff0c;显示驱动芯片&#xff08;DDIC&#xff09;的数据接口传输速率越来越高&#xff0c;MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求&#xff0c;作为国内少数拥有完全自研的LCD Driver测试解…

WebSocket 来单提醒和客户催单功能

一&#xff1a;WebSocket &#xff1a; WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#…