C++类与对象的初识

面向对象关注的是一个操作需要哪些对象完成。

类是数据(变量等)与操作(函数)的集合。

(类是对象的图纸)

在C++中,struct也可以内含成员函数。

调用时,变量名.成员-->与C中结构体使用相同,不过可以不用再写struct了

在C++中,我们更习惯用类,而不是兼容C的结构体

类的关键字:class

使用:class 类名{类的主体};

class表明这是一个类,类名用于区分不同类,代码块内部为类的主体为成员定义/声明(等会会讲声明),别忘了和结构体一样加分号。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者 成员函数

C++中class与struct区别?

1.不同:  1.struct可以定义结构体(兼容C),

                2.class默认访问权限是private(所以不好定义结构体(加public)),struct默认访问权限是public。

2.相同:struct,class都可以定义类

声明和定义:重点在于成员函数定义和声明:

1.直接在类的主体中定义-->可能编译器会将其当作内联函数处理

如果调用函数,汇编会用call调用函数地址。

2.声明与定义分离-->在别处定义(可以不同文件),定义时要指定类域-->成员函数名前要加类名。(硬性要求)。如果成员函数使用了成员变量,让类先定义,才有变量,成员函数在其定义之后定义。

规范:成员变量前加_和成员函数的形参区分

访问限定符初识:

类是方法与属性(数据)的封装,如果外部可以随意调用,就可能会引起一些不必要的由程序员造成的问题,那么,限定类中成员的访问(专业说是选择性的给外部提供接口)则是安全又高效的做法。

类别:

C++有三种访问限定符:public(公用),private(私有),protected(保护).

说明(规则):

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

2. protectedprivate修饰的成员在类外不能直接被访问(此处protected和private是类似的)

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

4. 如果后面没有访问限定符,作用域就到}即类结束。

5. class的默认访问权限为privatestructpublic(因为struct要兼容C

本质:

访问限定符只在编译时有用,目的是通过语法限定访问。

类的封装:

1.封装定义:封装指将数据与操作结合,并隐藏部分属性(数据)与细节(操作),仅提供部分接口给外部访问。

2.类的封装的实现:类中存在类域,成员作用域都在类域中,要调用要指定哪个类域。(与命名空间相同,都是对成员名字的隔离,防止名字冲突,实现指定访问,也保证了不会被随意调用)。

类的实例化:

首先,类是没有大小的,类仅仅相当于图纸,与C中结构体类型同。

所以,我们定义了一个类,仅仅为对象提供了一种实现方式。

而通过类定义一个对象,实实在在开辟空间的过程,叫类的实例化。

类(对象)的大小:

1.对象中,类定义的函数是没有大小的。

因为类与对象是1对多的关系,所以编译器让操作系统在全局区为函数开辟空间,且一个类的一个函数只开辟一次。(节省空间)

定义几个对象,他们都调用了同一函数地址。

this指针

那每个对象使用同一函数结果不同原因是每个对象传了自己的地址,给函数形参暗含的this指针。

如图:每个成员函数参数其实都默认有个不能改指向的this指针,但在参数部分不能写明,因为这是编译器处理的事,内部明着写或不写,都可以用,因为编译器处理好了。

问:1.this指针在哪里:在栈上或者寄存器上

2.this指针可以为空吗?

一个正常对象的地址不会为空,但可以定义类型为此类的指针,在通过指针找到成员函数并传给它。

其实是通过p指针调用了成员函数,成员函数接受了此类指针后确定是此类,能访问,再执行打印,由于打印没用到对象内部,不需解引用,也就不会出错。

(过程:把A类型变量*p地址传给能调用的print,this=p=nullptr,使用print成员函数)

下面的访问了对象内部,解引用了空指针,就会运行出错(语法出错是没有相应对象,c++代码书写有问题,不是标准定义的;(比如 int写成了in,漏写个分号,漏写个括号,把int型参数赋值给字符串,等等),一般语法错误在编译时都是可以被编译器发现,发出警示),或类型错误,运行出错指出现未定义行为如解引用空指针。)

2.内存对齐-->类的成员变量存在内存对齐。

对齐数=编译器默认对齐数与该类型大小的较小值。

总大小:最大对齐数的整数倍

开头变量默认对齐到0。

让其不对齐:更改编译器默认对齐数:#pragma pack(n)

为什么要内存对齐:CPU是按其地址总线大小的整数倍读取的,如32位,4字节,如果一次读取就是一个变量数据那效率高,但可能显示char1字节和int的前3个字节,在一次读Int的最后字节,再拼接起来。

3.sizeof()可加类名或对象,都是测类型的大小。

当sizeof()测只有成员函数或没有成员的类(对象)时,每个编译器会返回不同的值,表明已有此类或此对象已经初始化。

类的6个默认成员函数:

当一个类中什么都不写,称为空类,但其实空类中仍有6个默认的成员函数,是编译器在你不写他时自动帮你生成的。

1.初始化和清理

1.构造函数

主要用于对象成员的初始化。

1.规则:

1.名字与类名相同,

2.无返回值,

3.可重载,(半自动)

4.类实例化(对象初始化)时自动调用此函数,

5.构造函数无参数时,对象初始化不用加括号(以免和函数声明格式冲突)

6.其应被public访问限定符修饰,表明外界初始化对象时就能访问。

7.对象生命周期内只能使用一次。

2.使用:

1.一般设定为全缺省函数,将对象全按默认或输入的初始化一遍。

注意:全缺省初始化不传参时,不能加括号,防止和函数声明冲突。

即:对象初始化时不能加空括号,不然认为是函数声明。

3.自动化:

编译器在你没写构造函数时,会为你加一个,功能为:

1.可能处理你的内置类型变量(内置类型为语言自带的类型,如:Int,double...)

有的编译器会给你的内置类型变量赋0,有的不会动,所以里面还是随机值。(太假了,这个功能竟然还看编译器)。

2.调用自定义类型变量的构造函数(层层调用)。(如果你的成员自定义类型变量中有自己写的构造函数,这至少可以让这个变量内部成员初始化)。

应用:两个栈实现一个队列,类中放两个栈,类实例化时,栈内部都初始化了。

2.析构函数

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。(销毁成员变量)

1.规则

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值类型。

3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载(全自动,没地方给你加括号传参调用)

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数

5.需要public修饰,结束时才能在外界自动调用。

2.使用:

自己写个析构,在对象生命周期结束时自动销毁动态申请的空间。

3.自动:

如果对象内部有自定义类型变量,编译器会先调用自定义类型变量的析构,再调用当前类的析构(层层销毁返回)

注意:默认的析构函数不会销毁动态申请的空间,需要你自己写!

类的使用:

一般类直接在头文件里定义,类型定义不会导致重复定义错误。

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

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

相关文章

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果} }理解 从…

【逆向思考 】【拓扑排序】1591. 奇怪的打印机 II

本文涉及的知识点 逆向思考 拓扑排序 LeetCode1591. 奇怪的打印机 II 给你一个奇怪的打印机,它有如下两个特殊的打印规则: 每一次操作时,打印机会用同一种颜色打印一个矩形的形状,每次打印会覆盖矩形对应格子里原本的颜色。 一…

二、Docker部署Jenckins(详细步骤)

Docker部署Jenckins、初始化(详细步骤) 一、拉取镜像二、启动Jenkins三、访问Jenkins四、安装插件1.配置源2.插件安装 一、拉取镜像 docker安装教程:https://qingsi.blog.csdn.net/article/details/131270071 - 查询镜像 docker search jen…

通义灵码/Baidu Comate真能取代程序员吗?

目录 背景Baidu Comate通义灵码 思考 背景 Baidu Comate Baidu Comate提供AutoWork功能,号称“开发者只需定义需求,剩下的交给Comate AutoWork”。【李彦宏也说了,未来不会有程序员了~】 既然“Baidu Comate全新升级,向个人开发…

Flask Python:数据库多条件查询,flask中模型关联

前言 在上一篇Flask Python:模糊查询filter和filter_by,数据库多条件查询中,已经分享了几种常用的数据库操作,这次就来看看模型的关联关系是怎么定义的,先说基础的关联哈。在分享之前,先分享官方文档,点击查看 从文档…

C语言 | Leetcode C语言题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; int myAtoi(char * s){int i0;int out0;int pol1;int lenstrlen(s);if(len0) return 0;while(s[i] ) i; //删除空格if(s[i]-){ //判断正负pol-1;i;}else if(s[i]){pol1;i;}else{pol1;}while(s[i]!\0){if(s[i]<0||s[i]>9){ /…

Leetcode刷题笔记——多维动态规划篇

Leetcode刷题笔记——多维动态规划篇 第一题:最小路径和 Leetcode64&#xff1a;最小路径和&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的…

【JVM】关于JVM垃圾回收

文章目录 &#x1f334;死亡对象的判断算法&#x1f338;引用计数算法&#x1f338;可达性分析算法 &#x1f333;垃圾回收算法&#x1f338;标记-清除算法&#x1f338;复制算法&#x1f338;标记-整理算法&#x1f338;分代算法&#x1f338;哪些对象会进入新生代&#xff1f…

机器学习模型——逻辑回归

https://blog.csdn.net/qq_41682922/article/details/85013008 https://blog.csdn.net/guoziqing506/article/details/81328402 https://www.cnblogs.com/cymx66688/p/11363163.html 参数详解 逻辑回归的引出&#xff1a; 数据线性可分可以使用线性分类器&#xff0c;如果…

一文搞懂cookie,session,token,JWT到底是怎么进行验证的???

文章目录 cookiesessiontokenJWT 比较 HTTP 协议是一种无状态协议&#xff0c;每次服务端接收到客户端的请求时&#xff0c;都是一个全新且独立请求&#xff0c;这样就无法获取历史请求的记录&#xff0c;为了解决这种机制&#xff0c;让某个域名下的所有网页能够共享某些数据&…

DFS:深搜+回溯+剪枝解决组合问题

创作不易&#xff0c;感谢支持!!! 一、电话号码的组合 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string hash[10]{"","","abc","def","ghi","jkl","mno","pqrs"…

salesforce如何批量reassign审批人

salesforce的审批流程中&#xff0c;如果希望批量将审批人重新指派&#xff0c;可以在set up 中找到Mass Transfer Approval Processes选项进行reassign。 参考&#xff1a;https://trailhead.salesforce.com/zh-CN/trailblazer-community/feed/0D54S00000A7QNLSA3 还可以用a…

30.多个线程交替执行

线程一输出a,5次&#xff1b; 线程二输出b,5次&#xff1b; 线程三输出c,5次&#xff1b; 现在要求输出abcabcabcabcabc怎么实现&#xff1f; 采用wait和notifyAll实现 public class ThreadTest {public static void main(String[] args) {WaitNotify waitNotify new Wai…

Linux------一篇博客了解Linux最常用的指令

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

LInux脚本学习

1.注释 #单行注释 以 # 字符开头就是单行注释 当然第一行除外&#xff0c;比较特殊 2.多行注释 3.Shell文件的作用 Shell文件就是linux命令集 4.sh脚本的执行方式 bash xxx.sh 5.新建的文件会没有执行权限 #为文件赋予执行权限 chmod ux xxx.sh 6.编写规范 #!/bin/bash #…

C#,简单,精巧,实用的按类型删除指定文件的工具软件

点击下载本文软件&#xff08;积分&#xff09;&#xff1a; https://download.csdn.net/download/beijinghorn/89059141https://download.csdn.net/download/beijinghorn/89059141 下载审核通过之前&#xff0c;请从百度网盘下载&#xff08;无积分&#xff09;&#xff1a;…

Canvas背景绘制-24

本节会详细介绍下&#xff0c;如何绘制面板的背景。 概述 常用的技术称为图块复制(blitting)&#xff0c;即从离屏缓冲区中将内容发生变化的那部分背景图像复制到屏幕上&#xff0c;还有其它两种方法是将所有内容擦除并重新绘制&仅重绘内容发生变化的那部分区域。一般是用…

解决Vue中仓库持久化的问题,不借助插件用原生JS实现仓库持久化。了解仓库的插件机制、监听的时机

1、演示 前言&#xff1a;目前Vue有两种仓库&#xff0c;一种是Vuex&#xff0c;一种是Pinia&#xff0c;懂得都懂&#xff0c;这里就不详细介绍这两者的区别了 2、什么是持久化 仓库里面的数据是需要跨越页面周期的&#xff0c;当页面刷新之后数据还在&#xff0c;在默认情况下…

PHP在线加密系统网站源码

源码介绍 PHP在线加密系统网站源码&#xff0c;这个是sg的加密,免费可用(目前)并不会收费 源码说明&#xff1a;下载直接上传即可 下载地址 蓝奏云下载&#xff1a;https://wfr.lanzout.com/i6c331togiji

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索&#xff1a;为什么是B树&#xff1f; 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式&#xff1a;二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树&#xff1a;AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…