当前位置: 首页 > backend >正文

【C++语法】类和对象(2)

4.类和对象(2)

文章目录

  • 4.类和对象(2)
    • 类的六个默认成员函数
      • (1)构造函数:
        • 构造函数特点
        • 含有缺省参数的构造函数
        • 构造函数特点(续)
        • 注意事项
        • 构造函数补充

前面总结了有关对象概念,对比 C 与 C++ 编程范式;讲解类定义、访问限定、作用域、实例化;说明类存储大小含内存对齐,即便无成员变量也占 1 字节;还阐述 this 指针特性,它是成员函数隐式形参。忘记了就回去看

类和对象(1)

类的六个默认成员函数

空类并不是什么都没有,在用户没有显式实现的情况下,编译器会默认生成六个成员函数。

在这里插入图片描述

(1)构造函数:

构造函数的函数名与类名相同,在实例化类类型对象时自动调用,并且在对象的生命周期内只调用一次,构造函数的主要作用是初始化对象,而不是创建对象

构造函数特点

1.构造函数的函数名与类名相同
2.没有返回值,不写void
3.构造函数在对象实例化后自动调用
4.支持函数重载(函数重载的规则与之前学的内容一致)可以使用缺省参数

在这里插入图片描述

特别要注意:构造函数虽然是在对象实例化时编译器自动调用该函数。但不可以把构造函数放在private或protect中

在这里插入图片描述

含有缺省参数的构造函数

在这种情况下我们可以在对象实例化时进行传参,注意:这里是传参,并不是将对象进行初始化,要与结构体初始化区分开来,这里传参使用小括号”()”不是用”{ }”

在这里插入图片描述

构造函数特点(续)
  1. 如果用户没有显式定义构造函数,C++编译器会自动生成一个无参的构造函数,但如果用户生成了编译器不再会自动生成

  2. 对于编译器自动生成的构造函数,有如下的作用:
    1>该构造函数不会对编译器内置类型对象(int,float,double,char…)进行处理

    2>该构造函数会对自定义类型调用它的默认构造函数注意默认构造函数与其他的构造函数在使用上有很大的区别,在后面会详细说),如果该自定义类型没有默认的构造函数,编译器会报错

注意事项
  • 如果该自定义类型的构造函数为全缺省参数,编译器不会报错,当构造函数的参数中存在非缺省参数时,编译器会报错

  • 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且一个类中默认构造函数只能有一个。

  • 无参构造函数、全缺省构造函数,我们没写编译器默认生成的构造函数,都可以认为是默认构造函数

在这里插入图片描述

构造函数补充
  1. 一个类中默认构造函数只能有一个
  2. 一定要注意默认构造函数与普通构造函数的区别
  3. 实践中的总结
    • 1>一般情况下,构造函数都需要我们自己去定义。
    • 2>当一个类中没有内置类型成员变量,只有自定义类型变量时,我们可以对这个类不写构造函数,它会逐层调用其他自定义类型成员变量的构造函数

Q:关于编译器生成的默认成员函数,很多人会有疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依l日是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??

A:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。

注意:

  1. C++11中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。
  2. 当我们自己写了构造函数(无论是否为默认的构造函数),编译器就不会自动生成默认的构造函数了要么自己补充,要么使用关键字default强制编译器自动生成
  3. 在定义类中成员变量是进行变量声明并给出缺省值,而不是进行实例化后进行初始化,看起来非常像,但要注意区分。这里是给声明一个默认值(缺省值),当有其他值时不会使用该缺省值,包括构造函数

在这里插入图片描述

http://www.xdnf.cn/news/2187.html

相关文章:

  • 将服务器接到路由器上访问
  • 二叉堆-对顶堆 P1090-P1168-P2085
  • Java后端开发——分层解耦详解
  • Springboot用IDEA打jar包 运行时 错误: 找不到或无法加载主类
  • RAG vs 微调:大模型知识更新的最优解之争
  • Rule.resource作用说明
  • 使用 binlog2sql 闪回 MySQL8 数据
  • C++武功秘籍 | 入门知识点
  • 【Typecho】给Joe主题后台添加custom自定义功能!
  • 安装docker,在docker上安装mysql,docker上安装nginx
  • 华为云Astro canvas大屏与iotDA是怎样通过数据接入、数据中心的功能传输和通讯的?
  • 桌面端开发技术栈选型:开启高效开发之旅
  • WPF框架中异步、多线程、高性能、零拷贝技术的应用示例
  • 基于FFmpeg命令行的实时图像处理与RTSP推流解决方案
  • SpringBoot集成WebSocket,单元测试执行报错
  • lnmp1.5+centos7版本安装php8
  • C++:类和对象(上)---镜中万象:C++类的抽象之境与对象的具体之象
  • gin框架学习笔记
  • 学习笔记(算法学习+Maven)
  • 基于Matlab的MDF文件导入与处理研究
  • 一文详解Adobe Photoshop 2025安装教程
  • SourceTree与git搭建gitcode团队管理项目
  • 精益数据分析(26/126):依据商业模式确定关键指标
  • Python-41:最小替换子串长度
  • uml类关系(实现、继承,聚合、组合,依赖、关联)
  • Word/WPS 删除最后一页空白页,且保持前面布局样式不变
  • Linux——进程间通信
  • Android Compose 框架矢量图标深入剖析(七)
  • C语言中结构体的字节对齐的应用
  • ABAP Object Services