类和对象【二】this指针,构造函数和成员初始化列表【超详细】

文章目录

  • this指针
    • this指针的定义
    • this指针的“工作”原理
    • this指针的作用
    • this指针的特点
  • 构造函数
    • 构造函数的定义
    • 构造函数的作用
    • 构造函数的特点
    • 构造函数的调用方式
      • 括号法
        • 无参构造或者全缺省构造
        • 需要传参才能调用的构造函数
      • 隐式类型转换法
        • 是只传一个参数就能调用的构造函数
        • 是要传多个参数才能调用的构造函数
  • 成员初始化列表
    • 成员初始化列表的位置和语法
    • 成员初始化列表的特点
    • 总结

this指针

this指针的定义

C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),这个指针就是this指针
在函数体中所有“成员变量”的操作,都是通过该指针去访问。
只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成


this指针的“工作”原理

任何一个对象调用成员函数的时候
编译器都会隐式地把这个对象的地址也作为参数传递给成员函数,在成员函数的参数表中也隐藏着一个形参this,这个this就接收了编译器传递的调用成员函数的对象的地址

类似下图
在这里插入图片描述

只不过上述过程都由编译器自己完成,而且是隐式地完成
程序员看不见,也不能由程序员主动完成,会报错


this指针的作用

通过我的上一篇文章我们能知道:成员函数不是存储在对象中,而是存放在公共代码区

但是任何一个类实例化出的对象都能调用该类的成员函数,那么成员函数如何知道是哪一个对象在调用它呢?

  • 通过this指针就可以知道是哪一个对象在调用成员函数了,因为this指针指向了调用这个成员函数的对象

  • this指针是const修饰的指针,指向了调用成员函数的对象,那么this指针除了不能改变指向以外,所有的指针操作它都可以使用【例如 解引用,以及通过操作符 -> 使用对象的成员】

  • this指针可以区分成员函数中与对象的成员变量同名的变量,即this指针指向的那一个是成员变量

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


this指针的特点

  1. this指针的类型:类 类型* const,即成员函数中,不能改变this指针的指向

  2. this指针本质上是“成员函数”的形参,当对象调用成员函数时,编译器将对象地址作为实参传递给
    this形参【程序员不能显示传递】。所以对象中不存储this指针。

  3. 只能在“成员函数”的内部使用,因为this指针是形参,出了成员函数作用域就销毁了


构造函数

构造函数的定义

在创建对象时调用的特殊方法。其主要作用是给对象的成员赋值
在C++中,构造函数通常没有返回类型,并且不能被声明为const
在创建类的对象时,构造函数自动被调用
此外,构造函数可以重载,即可以有多个名字相同的构造函数,但参数列表必须不同。


构造函数的作用

主要作用:给存储在对象中的成员变量赋初值【注意:赋初值是赋值,不是初始化,初始化只能在定义时初始化一次,之后的改变成员的值都是赋值

次要作用:由于构造函数是实例化对象时,编译器自动调用

可以根据这个特点,在构造函数中添加初始化以外的操作【例如记录一下调用了多少次构造函数等】,根据需求自定


构造函数的特点

  1. 实例化对象时,编译器自动调用对应构造函数

  2. 构造函数名必须类名相同

  3. 构造函数没有返回值void也不用写

  4. 构造函数可以重载

    在这里插入图片描述

  5. 构造函数可以参数缺省

    在这里插入图片描述

  6. 如果类中没有显式定义的构造函数,编译器会自动生成一个默认的构造函数【如果显式定义了,就不会有这个默认构造函数了
    编译器给的默认构造函数:
    没有参数
    对内置类型(int ,char等)一般有的编译器可能初始化成0不做处理就是不初始化,让它还是随机值
    对自定义类型(类,结构体等)就调用它这个类型自己的默认构造【默认构造 即 不需要传参数就可以调用的构造函数,例如无参构造和全缺省的构造函数

    在这里插入图片描述
    C++11针对编译器给的默认构造内置类型不做处理的问题做出了一个优化:可以在类中内置类型声明时给它缺省值
    给了缺省值之后,编译器在调用构造函数之前就会用缺省值给内置类型的成员初始化

    在这里插入图片描述


构造函数的调用方式

括号法

无参构造或者全缺省构造

调用无参构造或者全缺省构造直接实例化对象就行
语法:类名 对象名

在这里插入图片描述
注意:
调用无参构造或者全缺省构造不要打空括号

因为
类名+标识符+()可以是一个返回值是类的对象的函数的声明

如果实例化对象的时无参构造也或者全缺省构造+()就区分不开

在这里插入图片描述

所以规定调用无参构造或者全缺省构造不要打空括号

在这里插入图片描述

需要传参才能调用的构造函数

语法; 类名 + 对象名+(参数表)


在这里插入图片描述

隐式类型转换法

是只传一个参数就能调用的构造函数

语法:== 类名 + 对象名 = 参数==
参数的类型必须与构造函数的形参类型一致

在这里插入图片描述


是要传多个参数才能调用的构造函数

语法: 类名 + 对象名 = {参数1,参数2,………}
参数的类型必须与构造函数的形参类型一致


在这里插入图片描述

原理:
语法上:
编译器使用 赋值操作符(=)的右操作数调用了构造函数构造出了一个临时对象再用这个临时对象拷贝构造出了目标对象

实际上:
编译器会在语法实现上做出优化
直接使用赋值操作符(=)的右操作数调用了构造函数构造出了目标对象


成员初始化列表

如果说类里写的是成员的声明,那么成员初始化列表就是成员定义初始化的地方


成员初始化列表的位置和语法

构造函数实现的()之后,构造函数的函数体之前

语法:
:+成员名+(要初始化成的东西),成员名+(要初始化成的东西)………


在这里插入图片描述


成员初始化列表的特点

  1. 成员初始化列表中只初始化存储在对象中的成员

  2. 每个成员只能在成员初始化列表中出现一次【成员初始化列表就是成员定义初始化的地方==,因为初始化只能初始化一次

    在这里插入图片描述

  3. 成员初始化列表初始化的顺序不是在成员初始化列表中成员变量出现的顺序
    成员变量在类中声明的顺序才是成员初始化列表初始化的顺序

    在这里插入图片描述

  4. 其他自定义类型的对象成员变量默认构造是在成员初始化列表中调用的【无论成员初始化列表中有没有写都会调用

  5. 以下成员变量必须在成员初始化列表中初始化
    1 引用成员变量【因为引用必须初始化
    2 const修饰的成员变量【因为被const修饰之后就不能被改变了,所以只能在初始化的时候赋初值
    3 其他自定义类型且没有默认构造的对象【因为没有默认构造,编译器就不能自动调用构造函数了,而给构造函数传参只能在定义初始化时传递

  6. 类中声明的成员变量的缺省值其实是传给成员初始化列表的,因为是缺省值,所以如果对应成员变量在成员初始化列表中已经有值了,就不会再用缺省值了

    在这里插入图片描述


总结

综上:成员初始化列表比构造函数更有优势

所以赋初值尽量使用成员初始化列表


以上就是本篇文章的全部内容了,如果对你有帮助的话,可以点赞收藏支持一下吗

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

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

相关文章

发泡机液压站比例阀放大器

发泡机液压站是提供动力和压力以驱动发泡机工作的系统。 发泡机是一种用于制备聚氨酯发泡材料的设备,而液压站则扮演着为发泡机提供必要动力的角色。具体来看,液压站的主要组成包括: 液压油箱:存储液压油,为系统提供液…

11.接口自动化测试-Allure报告(2)

目录 1.如何同时执行多个测试文件2.Allure的不同层级应用Allure报告: 1.如何同时执行多个测试文件 (1)新建bat文件 (2)写命令 cd ./testCase pytest -s --alluredir ./report --clean-alluredir allure serve ./repo…

Unity之圆环slider

一、参考文章 Unity_圆环滑动条(圆形、弧形滑动条)_unity弧形滑动条-CSDN博客 此滑动条拖动超过360后继续往前滑动值会从0开始,正常我们超过360度时不可在滑动。 二、 超过360度不可滑动问题解决 参考HTML文章制作: https://www.c…

Java后端-文件上传大小限制解决

spring版本 2.5.4 报错如下:The field multipartFile exceeds its maximum permitted size of 1048576 bytes. 我上传的文件大小为2.5MB,如下图 原因:springboot默认的上传单个文件大小为1MB,而一次请求最大为10MB。 解决方案…

DFS专题:电话号码的字母组合

DFS专题:电话号码的字母组合 题目链接: 17.电话号码的字母组合 参考题解: 代码随想录 题目描述 代码思路 将数字到字母的映射用字符串数组表示出来。然后利用回溯算法,解决n个for循环的问题,枚举出每一种符合要求的情况。 代…

【Java探索之旅】用面向对象的思维构建程序世界

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、初识面向对象1.1 什么是面向对象?1.2 面向对象与面向过程 二、类的定义…

中颖51芯片学习7. ADC模数转换

中颖51芯片学习7. ADC模数转换 一、ADC工作原理简介1. 概念2. ADC实现方式3. 基准电压 二、中颖芯片ADC功能介绍1. 中颖芯片ADC特性2. ADC触发源(1)**软件触发**(2)**TIMER4定时器触发**(3)**外部中断2触发…

LLM推理加速,如何解决资源限制与效率挑战

©作者|Zane 来源|神州问学 LLM加速推理,GPU资源破局之道。 引言 大型语言模型(LLM)已经在多种领域得到应用,其重要性不言而喻。然而,随着这些模型变得越来越普遍,对GPU资源的需求也随之激增&#xff…

Github Actions实现CI/CD(golang项目)

Github Actions构建CI/CD(golang项目) 1 基础概念 1.1 Actions GitHub Actions允许构建一个完整的 CI/CD Pipeline,与 GitHub 生态系统深度集成,而无需使用 Travis CI 或者 Circle CI 等第三方服务,对于开源项目都是…

在IDEA中解决SSM项目修改图片不能回显问题

1.问题描述 图片成功上传之后,件夹中已经显示图片了,但是访问图片资源会出现404错误,再重新启动服务器之后,发现这个错误又消失了,图片又能正常显示,但是必须重启Tomcat才有效。 2.解决方法如下&#xff…

一键生成数据库文档,从此告别人工整理文档

背景 在我们日常开发过程中,常常遇到项目需要出一个数据库文档,面对数据表众多的场景一个一个写显然不现实,于是 screw工具很好的满足了我们的需求,从此告别人工整理文档; screw工具它可以将整个数据库的表输出为数据库表结构文档…

【Linux】服务器时区 [ CST | UTC | GMT | RTC ]

目录 1. 硬件时间(Real_TIME Clock [RTC time]) 1.1 硬件时间简介 1.2 如何使用硬件时间 2. 系统时间(UTC时间)(Universal time) 2.1 系统时间简介 2.2 UTC时间 3. 本地时间(Local time&…

淘宝/天猫获取sku详细信息 API,item_sku-获取sku详细信息

淘宝/天猫获取sku详细信息 API,item_sku-获取sku详细信息 示例: {"seller_rate": true,"timeout_action_time": "2000-01-01 00:00:00","iid": "152e442aefe88dd41cb0879232c0dcb0","num": 10,"…

【UKE!】2024.4.19

2024.4.19 【你知道的都是真相。只可惜那些并不是真相的全部。】 Friday 三月十一 谷雨 <BGM “谷雨–音阙诗听”> AC :Answer Coarse,粗劣的答案 ​ CE :Compile Easily,轻松通过 ​ PC :Perfect Compile 完美的编译 ​ WA :Wonderful Answer,好答案 ​ RE :Run Exce…

C++设计模式:代理模式(十三)

1、代理模式 定义&#xff1a;为其他对象提供一种代理以控制&#xff08;隔离使用接口&#xff09;对这个对象的访问等。 动机 在面向对象系统中&#xff0c;有些对象由于某种原因&#xff08;比如对象需要进程外的访问等&#xff0c;例如在分布式的系统中&#xff09;&#x…

基于springboot实现工程教育认证的计算机课程管理平台项目【项目源码+论文说明】

基于springboot实现计算机课程管理平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足…

Liunx挂载硬件设备

一、mount命令&#xff08;用于挂载文件系统&#xff09; &#xff08;一&#xff09;语法格式&#xff1a;mount 参数 源设备路径 目的路径 &#xff08;二&#xff09;参数 1、-t&#xff1a;指定挂载的文件系统 &#xff08;1&#xff09;iso9660&#xff1a;光盘或光盘…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样&#xff1a; 想要把取到的数据展示成图片&#xff0c;那么你可以这样做&#xff1a; // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

输电线路运行特性及简单电力系统潮流估算(三)

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第三篇笔记。上一篇传送门。 辐射型网络和简单闭式网络的潮流估算方法 辐射型网络的潮流估算方法 指的是在网络中不含环形电路&#xff0c;为开式网络&#xff0c;而且全部负荷都只能用一个电源来供电的网络。 …

logistic分叉图

MATLAB代码 % 初始化 r_min 2.5; % 参数r的起始值 r_max 4.0; % 参数r的结束值 r_step 0.001; % 参数r的步长 r_values r_min:r_step:r_max; % 参数r的范围% 分岔图数据初始化 num_iterations 1000; % 总迭代次数 num_last_points 100; % 用于绘图的最后的这些…