[C++]:2初识C++(auto) + 类和对象上:

news2024/11/21 1:26:43

@[TOC](初识C++(auto) + 类和对象上)

一.初始C++

1.auto关键字:(C++11)

1.作为一个变量的类型给这个类型初始化,auto自动识别初始化这个变量值的类型,为auto类型的这个变量开辟一个合适的空间
补充:
1.typeid(变量名).name—>可以打印对应变量的类型:
2.auto声明的变量必须由编译器在编译时期推导而得。
3.对于一个auto的变量必须对他进行初始化
4.auto相当于一个站位符在编译的时候会进行类型的替换
5.auto不能声明一个数组;
6.auto是单行识别:建议一行不要初始化多个变量

在这里插入图片描述

2.可不可以作为函数参数呢?
auto自动识别不可以作为函数的参数:

在这里插入图片描述

3.auto具体比较好用在哪里呢?
可以进行复杂类型的自动识别不需要自己写复杂类型的声明:
在这里插入图片描述

4.可不可以作为函数返回值呢?
可以作为函数返回值:不建议作为函数返回值因为对于一个函数如果重复调用多个函数进行嵌套那么auto的类型返回值会把真正的函数类型藏的非常的深不利于他人对于代码的阅读!

在这里插入图片描述

5.auto作为指针类型和引用类型的区别:
1.声明指针类型:auto 或者 auto* 是具有同样的作用的:
2.auto声明引用类型必须要加上一个&,自己不去加上一个引用怎么知道这是一个引用!

在这里插入图片描述

2.基于范围的for循环(C++11)

1.范围for是C++11中引入的一个对于一个数组进行遍历的比较方便的方法:
2.自动的从数组中从头到尾的进行迭代每次++1下标。
3.把数组中的值初始化给e并且进行自动识别。
4.请注意:对于遍历的这个数组必须有一定的范围。
5.for循环迭代的范围必须是确定的
5-1. 对于数组来说就必须满足数组的大小是确定的:
5-2:对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

在这里插入图片描述

1.如果进行引用的auto类型可以在遍历数组的过程中通过e是别名的这个方式进行对于数组中值的修改:

在这里插入图片描述

3.nullptr空值:(C++11)

1.在C++98中说对于一个变量我们要去初始化它的初始值!
我们观察一下C++库(stedef.h)中对于NULL的定义:
1.通过我们的观察会发现有两个值一个是数值0
2.一个是一个空的指针类型:
在这里插入图片描述

使用空值的指针时面对的问题!

在这里插入图片描述

1.处理:

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
在C++98中,==字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,==但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

2.nullptr

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
    4.相当于既然NULL对于表示指针空值有这样一个问题我们就再定义一个nullptr用来专门表示指针空值。

在这里插入图片描述

二.类和对象上

1.面向对象和面向过程

1.C语言是面向过程的,对于一个问题我们想要去解决这个问题就要从头走到尾。
2.通过逻辑判断和功能函数的调用从头到尾解决这个问题。

1.C++是面向对象的,我们需要解决一个问题把这个问题分开成不同的对象,通过对象之间的互联去解决问题。

2.类的引入:

1.struct 的优化:

1.我们C语言的结构体只能声明不同类型的变量,我们通过C语言去实现一个栈这样的一个数据结构,我们需要把栈这个数据结构的功能函数和结构体进行分离
2.在C++中支持结构体里面可以声明成员变量和(声明或者定义成员函数)。

类的两种定义方式:

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
    2.部分函数定义放在类中作为函数类型的定义,主要把定义和声明分离。只在类中声明,在另一个cpp文件中去定义:

在这里插入图片描述

2.C++ 的class

1.相比struct — class更加的安全:
1-2:class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
1-1: struct 定义的类是默认是开放的,在全局(成员变量和成员函数的定义声明)都可以找的到。
请添加图片描述

1-2: class 定义的类是默认是私有的,在全局(成员变量和成员函数的定义声明)都找不到的。

请添加图片描述

3.处理 公共 :私有 :保护

1.public 公共
2.private 私有的
3.protected 保护 : 保护和私有现在是相同作用:

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

在这里插入图片描述

4.struct 和class区别:

1.struct 在C语言中是定义结构体的,结构体中只能定义类型变量。而且结构体类型在实例化的时候如果没有typedef就还有struct 这个东西,在C++中struct作为类去定义和class的区别是前面的默认公共 后面默认是私有 。(类具有的共性是可以声明和定义 成员函数)在c++中struct有C语言中的所有功能。

5.类的作用域:

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

请添加图片描述

2.关于push这个成员函数我们没有在类中去定义和声明我们在外面去声明这个成员函数我们需要使用::域访问限定符:同时因为函数定义比较长为了方便管理我们使用声明和定义分离的方式:

在这里插入图片描述

6.类的实例化:

1.我们举一个例子,类的定义相当于一个房子的图纸。
2.实例化相当于通过这个图纸造出一个实实在在的房子。
3.房子中住的人相当于成员变量。
4.一个图纸可以造多个房子,相同户型的房子住不同的成员变量:
5.实例化出的对象 占用实际的物理空间,存储类成员变量.

在这里插入图片描述

进行名称的修改一般我们会把成员变量名称前加上一个_

请添加图片描述

1.每个对象:成员变量进行实例化都会使用一块内存空间,但是公共的方法只有一份并且不会存在实例化的对象中有固定的一个空间存放公共函数。
2.每一个对象的大小就是成员变量的大小在实例化申请内存空间。
3.如何计算内存空间?
1.使用之前在C语言结构体的时候讲的内存对齐的概念:

请添加图片描述

在这里插入图片描述

总结:结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

7.this指针:

我们观察一下下面的代码:

请添加图片描述

1.我们思考一下为什么d1这个对象调用print方法(函数),不需要传参数就可以直接把对应的年月日打印出来?

2.这里是有一个隐藏的对象指针去进行对象的成员变量的访问打印相当于下面的图片:

请添加图片描述

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

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

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

相关文章

快速入门:Spring Cache

目录 一:Spring Cache简介 二:Spring Cache常用注解 2.1:EnableCaching 2.2: Cacheable 2.3:CachePut 2.4:CacheEvict 三:Spring Cache案例 3.1:先在pom.xml中引入两个依赖 3.2:案例 3.2.1:构建数据库表 3.2.2:构建User类 3.2.3:构建Controller mapper层代码 3.…

ModuleNotFoundError: No module named ‘torch‘

目录 情况1,真的没有安装pytorch情况2(安装了与CUDA不对应的pytorch版本导致无法识别出torch) 情况1,真的没有安装pytorch 虚拟环境里面真的是没有torch,这种情况就easy job了,点击此链接直接安装与CUDA对应的pytorch版本,CTRLF直接搜索对应CUDA版本即可查找到对应的命令.按图…

【复盘】主从延迟以及 Waiting for tablemetadata lock 线上问题

背景 今晚DBA给一个大表添加索引,1000多W,正好风控系统这个时间段有查询这个表的请求,于是就出现了复制延迟。 这是正常下的延迟 可以看出基本都是是100毫秒以下。 Waiting for tablemetadata lock,并且业务跑的SQL出现锁等待…

实现Traefik工具Dashboard远程访问:搭建便捷的远程管理平台

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…

24-数据结构-内部排序-基数排序

基数排序 基数排序,给关键字分成d位(组),,对每一位的情况,可能会出现的值位r(基数)个,然后分成r个队列,对每个对林进行分配耗时O(n),最后按照改位…

join、inner join、left join、right join、outer join的区别

内连接 inner join(等值连接):只显示两表联结字段相等的行,(很少用到,最好别用); 外连接 left join:以左表为基础,显示左表中的所有记录,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的记录,不匹配…

【C/PTA】顺序结构专项练习

本文结合PTA专项练习带领读者掌握顺序结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 7-1 是不是太胖了 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已…

山海鲸可视化B/S架构应用

一、什么是B/S架构 BS架构(Browser-Server架构)是一种常见的软件架构模式,其中系统的核心业务逻辑和数据处理都发生在服务器端(Server),而客户端(Browser)主要负责显示和用户交互。…

【AIGC核心技术剖析】用于 3D 生成的多视图扩散模型

MVDream是一种多视图扩散模型,能够从给定的文本提示生成一致的多视图图像。多视图扩散模型从二维和三维数据中学习,可以实现二维扩散模型的泛化和三维渲染的一致性。我们证明了这样的多视图先验可以作为可推广的 2D 先验,与 3D 表示无关。它可以通过分数蒸馏取样应用于 2D 生…

vue视频直接播放rtsp流;vue视频延迟问题解决;webRTC占cpu太大卡死问题解决;解决webRTC播放卡花屏问题:

播放多个视频 <div class"video-box"><div class"video"><iframe style"width:100%;height:100%;" name"ddddd" id"iframes" scrolling"auto" :src"videoLeftUrl"></iframe>&l…

Python---练习:求世界杯小组赛的总成绩(涉及:布尔类型转换为整型)

案例 世界杯案例 需求&#xff1a; 世界杯案例&#xff0c;世界杯小组赛的比赛规则是我们的球队与其他三支球队进行比赛&#xff0c;然后根据总成绩(积分)确定出线资格。小组赛球队实力已知(提示用户输入各球队实力&#xff09;&#xff0c;我们通过一个数字表示。如果我们赢…

C#冒泡排序算法

冒泡排序实现原理 冒泡排序是一种简单的排序算法&#xff0c;其原理如下&#xff1a; 从待排序的数组的第一个元素开始&#xff0c;依次比较相邻的两个元素。 如果前面的元素大于后面的元素&#xff08;升序排序&#xff09;&#xff0c;则交换这两个元素的位置&#xff0c;使…

yolov5多个框重叠问题

NMS&#xff08;Non-Maximum Suppression&#xff0c;非极大值抑制&#xff09;是一种在计算机视觉和目标检测领域常用的技术。它通常用于在图像或视频中找出物体或目标的位置&#xff0c;并剔除重叠的边界框&#xff0c;以确保最终的检测结果准确且不重叠。 会出现多个框重叠…

2020年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 要对二维列表所有的数据进行格式化输出,打印成表格形状,程序段如下: ls = [[金京,89],[ 吴树海,80]<

fastadmin框架token验证

在FastAdmin框架中&#xff0c;Token验证是一种常见的身份验证方法&#xff0c;用于确保用户请求的安全性和合法性。本文将介绍如何在FastAdmin框架中实现Token验证。 什么是Token验证&#xff1f; Token验证是一种基于令牌(Token)的身份验证方式。在这种方式下&#xff0c;用…

Docker部署Jumpserver堡垒机

Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是符合 4A 的专业运维审计系统。 Jumpserver 使用 Python / Django 进行开发&#xff0c;遵循 Web 2.0 规范&#xff0c;配备了业界领先的 Web Terminal 解决方案&#xff0c;交互界面…

Android11修改自动允许连接到建议的WLAN网络

客户的app需要连接指定的wifi,但是会提示下面的对话框(是否允许系统连接到建议的WLAN网络?): 客户需求:不提示这个对话框自动允许。 根据字符串定位到frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiNetworkSuggestionsManager.java 中的privat…

【C++】-c++的类型转换

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

020-第三代软件开发-日志模块

第三代软件开发-日志模块 文章目录 第三代软件开发-日志模块项目介绍日志模块日志Demo第一代日志系统第二代日志系统 关键字&#xff1a; Qt、 Qml、 日志、 Log、 SQLite 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Ob…

【Java基础面试三十四】、接口中可以有构造函数吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;接口中可以有构造函数吗…