C++系列之类与对象(上)

news2024/11/18 4:16:52

在这里插入图片描述

💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞

类的概念

C++是基于面向对象的,是对象与对象之间的交互完成的,类与C语言中的结构相似,是既能表示属性又能表示行为的复合数据类型,在C++中不仅可以定义变量,也可以定义函数,由这一个类型来描述一个对象。

类的定义

在C++中可以用class ,struct来定义类,class为定义类的关键字, class (?)之后是类的名字 {}之中是类的主体
类中的变量被称为成员变量或者类的属性 类中的函数被称为成员函数或者类的方法 //有两种定义方法

// 一是成员函数声明和定义全都放在类体中,编译器会默认为内联函数(但代码量很多则不会)

在这里插入图片描述

在这里插入图片描述
//二是定义与声明分离
在这里插入图片描述

面向对象的三大特性之封装

封装的概念

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

访问限定符

【访问限定符说明】
//public protected private

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
//当访问权限不是public时,书写方式:返回类型 类名 ::成员函数 /变量

在这里插入图片描述

类的实例化

//类中是声明,没有实际的储存空间,类相当于图纸,只有实例化才能由实体的储存建筑 一个类可以实例化多个对象,实例化出的对象
占用实际的物理空间,存储类成员变量

在这里插入图片描述

类的大小计算

对象只包含类中的各个成员 成员函数都放到公共的代码段里//因为节省内存空间 由c语言内存对齐可知类的储存大小
//没有成员变量和成员函数的类sizeof(类名)为1

this指针

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。 所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递 //this指针作为成员函数的形参储存在栈征中,随栈征的销毁而销毁 //this指针可以为空,只不过使不使用

类的6个默认成员函数

//默认成员函数,都是创建类类型对象时由编译器自动调用,可以在类中重写各个默认成员函数

构造函数

//构造函数的任务不是开空间创建对象而是初始化对象 //创建空间实例化的时候就已经创建空间。 特征:

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。

在这里插入图片描述

  1. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成 //编译器生成的构造函数,对内置不会处理,对自定义类型会产生它的默认构造(这里指的自定义类型一般是class/struct/union)
    //注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值(这里不是初始化)相当于缺省值

在这里插入图片描述

  1. 无参的构造函数和全缺省的构造函数,编译器默认构造函数都称为默认构造函数,且只有一个默认构造函数

在这里插入图片描述
//注意事项
在这里插入图片描述

析构函数

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值类型。
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重 载
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。 //默认生成的析构不会对内置类型进行释放(有内存泄漏),自定义类会调用它的析构函数。例:静态数组不会释放 如int a[100]作为内置类型存储在栈上,随作用域销毁而销毁,而内置类型inta =
    (int
    )malloc在堆上申请空间,默认编译器不会进行释放。
  5. 编译器生成的默认析构函数,对自定类型成员调用它的析构函数.
  6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

在这里插入图片描述

拷贝构造函数

析构两次 ,一个拷贝会影响另一个

  1. 拷贝构造函数是构造函数的一个重载形式。
  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错//传值拷贝,会无限形成拷贝构造,所以用引用接收一般用const Date& d
  3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝
  4. 注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

在这里插入图片描述

  1. 编译器自动生成的拷贝函数就已经实现值拷贝那么重定义的意义是 当拷贝对象连申请空间都拷贝时,对象储存在栈上,当对象依次被销毁时,连拷贝的同一块空间就会析构多次,一是一个空间不能析构很多次,二是指向同一块空间,内容会一起被修改,所以需要重定义拷贝函数实现深拷贝(这里主要针对向堆申请的空间)
    总结就是类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝
    //自定义类型和内置类型 都不用写 默认编译器会实现stack需要自己实现
  2. 拷贝构造函数典型调用场景: 使用已存在对象创建新对象 函数参数类型为类类型对象 函数返回值类型为类类型对象
    //传值 或 值返回 可以用引用返回 减少拷贝 //不能返回局部对象的引用,栈销毁随之销毁

运算符重载

运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数 函数名字为:关键字operator后面接需要重载的运算符符号。
注意:
1.不能通过连接其他符号来创建新的操作符:比如operator@
2.重载操作符必须有一个类类型参数 3用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
5…* :: sizeof ?: . 注意以上5个运算符不能重载。 // 这里需要注意的是,左操作数是this,指向调用函数的对象

在这里插入图片描述
在这里插入图片描述

赋值运算符重载

//已经存在的两个对象复制拷贝 性质:赋值运算符重载
//用一个已经存在的对象初始化另一个对象 性质:构造函数

  1. 赋值运算符重载格式
  2. 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值检测是否自己给自己赋值 返回*this:要复合连续赋值的含义

在这里插入图片描述
在这里插入图片描述

  1. 赋值运算符只能重载成类的成员函数不能重载成全局函数 //如果生成为全局,默认构造仍旧会生成一个赋值重载函数,但可以声明与定义分离(其他成员函数不能写为全局,其他符号重载可以写为全局)
  2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝
    //默认生成赋值重载和拷贝构造行为一样
    //1.内置类型浅拷贝
    // 2.自定义类型会调用他的赋值重载,stack需要我们自己实现 //运算符重载的参数知道保证一个自定义类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
//返回类型为引用类型还是传值返回,主要看正确性,二是看效率
在这里插入图片描述

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

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

相关文章

docker构建PHP环境

docker构建PHP环境 文章目录 docker构建PHP环境下载镜像构建本地目录创建容器配置补充命令解释设置docker启动时启动容器 下载镜像 # php 镜像 docker pull php:7.4-fpm # nginx镜像 docker pul nginx:lates # 检查下载的镜像 docker images构建本地目录 本次构建是在win系统…

怎么查营业执照经营范围

怎么查营业执照经营范围 1.到企业公司所在地查询。一般工商局都要求公司将营业执照正本悬挂于企业办公室醒目位置,在公司工商营业执照正副本中均有描述。 2.登陆国家工商管理网站查询。可以登陆开具发票单位所在的工商行政管理局网站,输入企业名称就可以查询法人、企业类型、经…

第七章 中断

中断是什么,为什么要有中断 并发是指单位时间内的累积工作量。 并行是指真正同时进行的工作量。 一个CPU在一个时间只能执行一个进程,任何瞬间任务只在一个核心上运行。 而CPU外的设备是独立于CPU的,它与CPU同步运行,CPU抽出一点…

2023年十大最佳黑客工具!

​用心做分享,只为给您最好的学习教程 如果您觉得文章不错,欢迎持续学习 在今年根据实际情况,结合全球黑客共同推崇,选出了2023年十大最佳黑客工具。 每一年,我都会持续更新,并根据实际现实情况随时更改…

山西煤矿电子封条算法 opencv

山西煤矿电子封条通过pythonopencv网络模型AI视觉技术,pythonopencv算法模型实现对出入井人监察控制、调度室空岗识别、生产作业状态、摄像头遮挡、挪动角度识别、货运车辆出矿识别等。 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台…

CleanMyMac X如何下载解锁完整版本?

这是一款很受到mac用户喜爱的清理软件。不仅清理文件的步骤十分简单,电脑小白用户也可以高效清理Mac电脑。作为一款全方位保护电脑的软件,CleanMyMac已经不满足于只做简单的Mac清理工具,而是为mac用户提供更多的实用功能:优化系统…

机器学习随记(7)——bootstrap、bagging、boosting、随机森林

bootstrap:是一种统计方法,也是一种思想,简单说就是在所有样本集中进行有放回地抽样,抽取n个样本。如果不清楚样本的分布,bootstrap是一种合适的方法。 bagging:Bagging方法在训练过程中,各基分…

windows提权

权限提升概述 1、提权介绍 权限提升:攻击者通过安全漏洞把获取到的受限制的低权限用户突破限制,提权至高权限的管理员用户,从而获取对整个系统的控制权 windows:user --> system/administrator linux:user --&g…

ASEMI代理Infineon英飞凌IPB072N15N3G原厂MOS管

编辑-Z IPB072N15N3G参数描述: 型号:IPB072N15N3G 持续漏极电流:100A 脉冲漏极电流:400A 雪崩能量,单脉冲:780 mJ 栅极-源极电压:20V 功率耗散:300W 操作和储存温度&#xf…

Voxformer代码 DataLoader 的编写

Stage 1: 目标是 使用QPN 生成 Occupancy Field 读取 需要读取 pseudo 的 vox_path 实际的 test 发生在 lmsnet.py 这个文件 input :25625632 的 pseudo point output: 12812816 的 Occupancy Grid 代码中 实际inference 的输入是 img_metas[0]["pseudo_pc"] 因此…

算法小课堂(十)随机化算法

目录 一、概述 1.1概念 1.2分类 二、数值随机化算法 2.1随机数 2.2用随机投点法计算Π值 2.3随机投点法计算定积分 三、舍伍德(Sherwood)型随机化算法 3.1随机洗牌算法 3.2随机快速排序:随机选择枢点的快速排序算法 3.3找出这n个元素…

STL——string类的模拟实现

0.关注博主有更多知识 C知识合集 目录 1.编码问题 2.string类概述 2.6习题练习 3.string类的模拟实现 3.1成员变量 3.2迭代器部分 3.3类的默认成员部分 3.4容量接口 3.5增删查改接口 3.6通用接口 3.7输入与输出 3.8完整代码 1.编码问题 实际上在我们接触C之前就…

SpringBoot入门(构建、打包、启动、起步依赖starter)

文章目录 1 SpringBoot快速入门1.1 开发步骤步骤1 创建新模块步骤2 创建 Controller步骤3 启动服务器步骤4 进行测试 1.2 对比1.3 官网构建工程步骤1 进入SpringBoot官网步骤2 选择依赖步骤3 生成工程 1.4 SpringBoot工程快速启动1.4.1 问题导入1.4.2 打包1.4.3 启动 2 SpringB…

OverTheWireBandit教程(1-10)

这个网站还挺好玩的于是我就抽点时间做了一下 OverTheWire的登录网址:OverTheWire: Bandit 本人用的是远程连接软件mobaxterm,windows自带的ssh版本不对用不了 Bandit Level 0 Level Goal The goal of this level is for you to log into the game usi…

使用ASM直接生成字节码的方法

ASM是一套java字节码分析/生成/修改的工具,它能够在java程序运行时直接修改java字节码文件,换句话说它能够直接修改java的二进制文件;也能够跳过编译直接生成字节码文件。所以ASM功能非常强大,对于代码性能提升、代码问题定位都非…

【技术】《Netty》从零开始学netty源码(六十)之ByteToMessageDecoder

ByteToMessageDecoder 在Netty中用于拆包的解码器都继承了抽象类ByteToMessageDecoder,它的类结构如下: 从中可以看出它其实就是一个handler,只要添加到pipeline中channel每次读取数据的时候都会得到解析,它的数据结构如下&#…

业绩涨,股价不涨,蓝思科技深陷「果链困局」

作者 | 辰纹 来源 | 洞见新研社 曾经的女首富,蓝思科技董事长周群飞很困惑,公司业绩明明还算不错,可股价却怎么也涨不起来,距离市值2000亿的顶点更是遥遥无望。 根据不久前(4月23日)蓝思科技发布的2022年…

Mybatis中处理特殊SQL处理逻辑

文章目录 0、前言1、模糊查询2、动态表名3、获取自增的组件4、批量删除 0、前言 在MyBatis中可能会有一些特殊的SQL需要去执行,一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种,现在分别来进行说明。 为了方便演示 &#xff0…

强化学习路线规划之深度学习代码练习预备

前面已经练习过神经网络的相关代码,其实弄明白了你会发现深度学习其实是个黑盒,不论是TensorFlow还是pytorch都已经为我们封装好了,我们不需要理解深度学习如何实现,神经网络如何计算,这些都不用我们管,可能…

一看就懂之与栈结构(FILO)相对的——队列结构(FLFO)

文章目录 一、什么是队列,什么是FIFO二、使用C模拟实现以及解析队列1.结构体的定义2.队列的创建及销毁3.实现插入操作4.队列删除操作5.获取栈中有效元素个数以及头元素尾元素 源代码分享 一、什么是队列,什么是FIFO ​ 队列允许在一端进行插入操作&…