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

news2024/11/19 8:25:46

文章目录

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

    在这里插入图片描述


总结

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

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


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

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

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

相关文章

HCIE-Shell实验1

要求: 判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。判断web服务是否运行(1、査看进程的方式判断该程序是否运行,2、通过查看端口的方式判断该程序是否运行)&…

大模型应用开发基础

AGI 时代,AI 无处不在,形成新的社会分层: AI 使用者,使用别人开发的 AI 产品AI 产品开发者,设计和开发 AI 产品基础模型相关,训练基础大模型,或为大模型提供基础设施 越向下层,重要…

Leetcode-168.Excel表列名称

题目描述 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1: 输入:columnNumber 1 输出:"A"…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

揭开ChatGPT面纱(一):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

虚拟ip地址怎么弄到手机上

在当下的社会&#xff0c;手机已经变得至关重要&#xff0c;它融入了我们的日常生活&#xff0c;无论是上网冲浪、社交互动&#xff0c;还是工作学习&#xff0c;都离不开它。但有时候&#xff0c;由于某些限制&#xff0c;我们可能无法充分享受网络带来的便利。这时&#xff0…

《苍穹外卖》Day02部分知识点记录

一、属性的拷贝以及密码的加密 使用org.springframework.beans中的BeanUtils.copyProperties()方法时&#xff0c;二者的属性名必须要一致。 /*** 新增员工* param employeeDTO*/Overridepublic void save(EmployeeDTO employeeDTO) {Employee employee new Employee();// 对…

spring webflux 小结

一、WebFlux 简介 WebFlux 是 Spring Framework5.0 中引入的一种新的反应式Web框架。通过Reactor项目实现Reactive Streams规范&#xff0c;完全异步和非阻塞框架。本身不会加快程序执行速度&#xff0c;但在高并发情况下借助异步IO能够以少量而稳定的线程处理更高的吞吐&…

COIN++: Neural Compression Across Modalities 论文阅读笔记

1. 论文基本信息 发布于&#xff1a; TMLR 2022 2. 创新点 使用元学习将编码时间减少了两个数量级以上&#xff0c;将编码共享结构进行编码&#xff0c;并对该网络应用调制来编码实例特定信息。量化和熵编码调制。虽然我们的方法在压缩和速度方面都大大超过了 COIN&#xff0…

Navicat导入sql文件图文教程

本文使用的MySQL工具为:Navicat.默认已经连接数据库!! 步骤: 1.右键自己的数据库,选择新建数据库. 2.输入数据库名称&#xff0c;字符集选择“utf8”&#xff0c;排序规则选择“ utf8_general_ci”,确定. 3.双击新建好的“数据库”。右键点击“运行SQL文件”。 4.选择本地的s…

Linux上的uname

2024年4月19日&#xff0c;周五上午 这是我第一篇用CSDN上的markdown编辑器写的博客&#xff0c;感觉还不错 uname 是一个常用的命令行工具&#xff0c;uname 的全称是 “Unix Name”&#xff0c;它是一个 Unix 和类 Unix 操作系统上的命令行工具&#xff0c;用于获取操作系统相…

同旺科技 USB TO SPI / I2C适配器读写24LC256--页写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版&#xff1b; 从00地址开始写入64个字节&#xff0c;然后再将64个字节读回&#xff1b; 页写时序&#xff1a; 读时序&#xff1a…

【不看后悔】AGI时代,这些工具真的能让你收入翻倍!

引言 在数字化浪潮中&#xff0c;AIGC已经成为不可或缺的一部分 无论你是一名内容创作者&#xff0c;还是简单的社交媒体用户&#xff0c;免费的AI工具都能在多个层面助你一臂之力。这些工具涵盖从文本创作到图像设计&#xff0c;再到视频制作等多个方面&#xff0c;不仅可以…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

基于java+springboot+vue实现的校园一卡通系统(文末源码+Lw+ppt)23-26

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;校园一卡通利用计算机网络实现信息化管理&#xff0c;使整个校园一卡通管理的发展和服务水平有显著提升。 本文拟采用java技…

圣地亚哥 Toler 小学利用School AI帮助每个学生都有自己的聊天机器人,提高学习兴趣和效率

圣地亚哥 Toler 小学利用 AI 程序 SchoolAI 平台为学生创建个性化的聊天机器人&#xff0c;帮助他们更好地学习和提问。这个 AI 程序让学生可以在几秒钟内得到问题的答案&#xff0c;激发了他们提出更多问题的好奇心。 管理、调节和指导学生如何通过任务控制使用人工智能。 当…

Python性能优化技巧

Python作为一种高级编程语言&#xff0c;凭借其简洁易读、开发效率高的特点&#xff0c;受到了广大开发者的喜爱。然而&#xff0c;在追求开发效率的同时&#xff0c;我们也不能忽视Python代码的性能问题。在大数据处理、机器学习等场景下&#xff0c;Python代码的性能往往成为…

SQLite数据库中JSON 函数和运算符(二十七)

返回&#xff1a;SQLite—系列文章目录 上一篇:维护SQLite的私有分支&#xff08;二十六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​1. 概述 默认情况下&#xff0c;SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON 字…

Golang | Leetcode Golang题解之第37题解数独

题目&#xff1a; 题解&#xff1a; func solveSudoku(board [][]byte) {var line, column [9][9]boolvar block [3][3][9]boolvar spaces [][2]intfor i, row : range board {for j, b : range row {if b . {spaces append(spaces, [2]int{i, j})} else {digit : b - 1line…

Octopus+: An RDMA-Enabled Distributed Persistent Memory File System——泛读笔记

TOS 2021 Paper 分布式元数据论文阅读笔记整理 问题 非易失性存储器&#xff08;NVM&#xff09;和远程直接存储器访问&#xff08;RDMA&#xff09;在存储和网络硬件中提供了极高的性能。然而&#xff0c;现有的分布式文件系统隔离了文件系统和网络层&#xff0c;而且分层的…