C++初阶 类和对象(上)

前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

目录

一、什么是面向对象编程

二、什么是类和如何定义类

1.类的概念

2.类的特点

3.访问限定符

4.如何定义类

5.类定义的小细节

6.类的大小如何计算?

7.this指针

三、下期预告


一、什么是面向对象编程

在C语言中,我们编写代码更多地是面向过程进行编写的,通过分析出求解问题的步骤,然后函数调用逐步解决问题。比方说洗衣服,在C语言的实现就是打开洗衣机->放衣服进去->倒入洗衣液->关上洗衣机->启动洗衣机->洗衣机翻滚->洗衣机甩干......如此一步一步地实现。

而在C++中更多的是面向对向对象进行编写的。洗衣服这个操作,操作的对象便有4个,洗衣机,洗衣液,衣服和人,洗衣服在C++的实现则是使用这4个对象互相交互实现的,而人是不需要去关注洗衣机是如何去洗衣服的,只需要把事情交给洗衣机干就行了。这便是面向过程编程和面向对象编程的区别。

二、什么是类和如何定义类

1.类的概念

其实在C语言的学习中,我们已经接触到了类这一内容,那便是我们的结构体, 而在C++中更喜欢将结构体称作类。在C语言中我们使用struct定义结构体,在C++中我们不仅可以通过struct定义类,也可以通过class定义类。两种方式几乎一样,只有一点是不太一样的,后面在访问限定符中我们会讲到。

2.类的特点

相比于C语言中结构体的使用,类的使用更显特别,类的里面不止可以定义成员,还可以定义成员函数,更有趣的是它可以令部分内容为私有,令部分内容为公有。什么是公有呢,在类外面也可以访问,而私有则相反,只能在类中使用,听上去是不是有点抽象,没关系,我们在之后的内容会有详细的讲解。

3.访问限定符

在讲解如何定义类之前我们还要再补充一点,那便是访问限定符。类的访问限定符分为三种:public(公有的),protected(被保护的),private(私有的),private和protected在目前的学习中是可看作一样的,之后需要使用到它们之间的特性时会特别强调,当然这还要很久。回到之前的问题,struct和class有什么区别?

区别就在于struct定义的类默认是公有的,class定义的类默认是私有的。

1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。

4.如何定义类

方法1:声明和定义全部放在类中

#include<iostream>
using namespace std;
class abc
{
public:
//公有的,意味着可以被外界访问void init()//初始化函数{_a = 520;_b = nullptr;_c = 13.14;}void print()//打印函数{cout << _a << endl;cout << _b << endl;cout << _c << endl;}
private:
//私有的,不能被外界访问int _a;int* _b;double _c;
};
int main()
{abc a1;//创建一个类型为abc的变量a1;a1.init();//初始化a1.print();//打印
}

简单运行下

 试着访问下私有,报错

方法2:声明和定义分离:

在写类的成员函数时肯定会有同学想像之前一样,将多个函数的定义写在同一个文件中。这是可以实现的

声明写在头文件中

定义写在对应文件中

一样可以运行出正确结果 

5.类定义的小细节

不知道你们有没有发现,博主在定义类的成员变量的时候在变量之前加了_定义了_a,_b,_c这样的变量,为什么博主不直接定义a,b,c呢?当我们在进行赋值操作的时候,令成员变量变为另一个参数时,我们书写的代码很可能是这样的,a对应a,b对应b,c对应c。

当有同名变量出现的时候,编译器会根据就近原则进行运行,也就是令100=100,200=200,300=300并不会真正影响到我们创建的abc中的成员变量,为了方便区分,我们在创建类的时候,通常会在成员变量前加_或者是后加_,如此便可以很快速的识别出变量的用途,对变量进行对应的赋值。 

6.类的大小如何计算?

先说一个结论:类的计算是不包括this指针和成员函数的,this指针等下会讲到。如何计算类的大小,有如下规则(把结构体换成类即可)

(1) 第一个成员在与结构体变量偏移量为0的地址处。
(2) 其他成员变量要对齐到某个对齐数的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。
VS中默认的值为8
(3) 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
(4) 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


自定义类型详解_大海里的番茄的博客-CSDN博客

博主写的这篇文章有更详细的解答,感兴趣的同学可以去看一下。

7.this指针

学过C语言的同学看这个传递变量的过程一定会觉得怪怪的:为什么不用.或者->就能够修改结构体的成员变量呢(类),那是因为我们C++有一个隐藏的变量被传递过去了,那便是this指针,this指针存放了你所传递变量的地址   且在中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

当然你想要显示的实现变量的访问过程也是可以的,两者没有区别。如果你之前写的是C语言,现在一定会很爽QAQ。

最后需要提醒的一点细节便是this指针为了方便调用一般存储在寄存器上。

三、下期预告

下一回我们来聊下构造函数和析构函数,这周必出餐QAQ

好了,今天的分享到这里就结束了,感谢各位友友的来访和阅读,祝各位友友们前程似锦O(∩_∩)O 

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

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

相关文章

Python 十五个炫酷代码

1 炫酷彩虹 视频是动态的&#xff0c;不信你运行试试。 from turtle import *colors ["red", "yellow", "blue", "lime"] bgcolor("black")x 6 t [Turtle(), Turtle()]for index, i in enumerate(t):i.speed(0)i.color(&…

【排序算法】希尔排序(C语言)

【排序算法】—— 希尔排序 目录 一、希尔排序原理1. 插入排序的问题2. 希尔排序的思路 二、希尔排序的相关问题1. 为什么插入排序那么多但效率却很高2. 如何选择希尔增量 三、代码实现1. 代码实现思路2. 实现代码 希尔排序是对直接插入排序的优化&#xff0c;在学习之前&…

C++ 之命名空间namespace【详解】

文章目录 一&#xff0c;命名空间出现的意义二&#xff0c;命名空间的定义命名空间里面可以包含变量&#xff0c;函数&#xff0c;类型&#xff1a;命名空间不可以定义在局部作用域&#xff1a;命名空间可以嵌套&#xff1a; 三&#xff0c;同一个工程中允许存在多个相同名称的…

Axios 通过a标签下载文件 跨域下载

<!-- a标签占位 --><a ref"down" ></a>getTest() {this.$axios.request({url: https://cnv13.55.la/download?file_key3695fa9461a0ae59cf3148581e4fe339&handle_typeexcel2pdf,method: get,responseType: blob, // 切记类型 blob}).then(re…

语音识别技术在医疗行业中的应用案例

随着语音识别技术和计算机视觉技术的不断提高&#xff0c;现代医学正在进入全面数字化时代。 追求高质量的训练数据是人工智能产业的信条&#xff0c;得到更为精准的语音机器模型更离不开语音数据的不断供给。本文讲介绍: 什么是语音识别技术语音识别技术如何应用于医疗行业 …

shell 脚本的函数和数组

函数 —— 封装的一个公式&#xff1a;sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块&#xff0c;在函数中写执行的命令即可&#xff1b;使用函数可以避免代码重复&#xff0c;增加可读性&#xff0c;简化脚本&#xff0c;使用函数可以将大的工程分割为若…

JSP过滤器和监听器

什么是过滤器 Servlet过滤器与Servlet十分相似&#xff0c;但它具有拦截客户端&#xff08;浏览器&#xff09;请求的功能&#xff0c;Servlet过滤器可以改变请求中的内容&#xff0c;来满足实际开发中的需要。 对于程序开发人员而言&#xff0c;过滤器实质就是在Web应用服务器…

九、ffmpeg命令转封装

开了几天小差&#xff0c;今天继续学习ffmpeg。 准备测试使用的视频&#xff0c;并查看其信息 # 查看视频信息。使用Mediainfo也可以 ffprobe test.mp4 视频格式的信息如下。 保持编码格式&#xff1a;ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.tsffmpeg -i…

Unity地面交互效果——6、地形动态顶点置换和曲面细分

回到目录 Unity置换贴图局部距离曲面细分 大家好&#xff0c;我是阿赵。   这篇文章是我无聊的时候做了一个demo&#xff0c;觉得挺有趣&#xff0c;于是就发上来。这里面包含了4个内容&#xff1a;置换贴图、顶点偏移、局部曲面细分&#xff0c;曲面细分按距离调整强度。 …

Jmeter快速入门

文章目录 1.安装Jmeter1.1.下载1.2.解压1.3.运行 2.快速入门2.1.设置中文语言2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载&#xff0c;地址&#xf…

Volcano3D绘制3D火山图

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 本期教程内容 **注&#xff1a;**本教程详细内容 Volcano3D绘制3D火山图 一、前言 火山图是做差异分析中最常用到的图形&#xff0c;在前面的推文中&#xff0c;我们也推出了好几期火山图的绘制教程&#xff0…

ELK企业级日志分析平台——ES集群监控

启用xpack认证 官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#node-certificates 在elk1上生成证书 [rootelk1 ~]# cd /usr/share/elasticsearch/[rootelk1 elasticsearch]# bin/elasticsearch-certutil ca[rootelk1 ela…