首页 > 编程语言 >【C++ Primer读书笔记】7.1.4 构造函数

【C++ Primer读书笔记】7.1.4 构造函数

时间:2023-08-13 17:32:40浏览次数:47  
标签:初始化 读书笔记 初始值 默认 列表 编译器 7.1 构造函数

构造函数

  1. 构造函数的任务是初始化类对象的数据成员
  2. 被调用的时机,无论何时只要类的对象被创建,就会调用构造函数
  3. 构造函数的特殊性 1. 构造函数与类名称相同 2. 构造函数没有返回值 3. 构造函数不能被声明为 const ,因为当我们创建一个 const 对象时,直到构造函数完成初始化过程,对象才能真正取得其 常量 属性。因此构造函数在const对象的构造过程中可以向其写值

默认构造函数

  1. 只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。编译器合成地默认构造函数按照如下规则初始化类的数据成员 如果存在类内初始值,用它来初始化成员。否则,默认初始化该成员 注意 给类的数据成员一个默认值是必要的。否则会引发很多不确定的情况。如下
#include "Person.h"

int main()
{
	Person libai;
	libai.print();
	return 0;
}

打印出 如下

 -858993460

注意 并不是所有情况编译器都能为一个类生成默认的构造函数,如在一个类中的数据成员有其它类类型的,并且这个类类型的数据成员没有默认的构造函数那么此时编译器将无法为这个类生成默认的构造函数。

=default

在C++11 新标准中,如果我们需要默认的行为,那么可以通过在参数列表后面写上 =default 来要求编译器生成构造函数如

Sales_data() = default;
//因为这个构造函数没有 参数,所以会生成默认的无参构造函数

思考 为什么会有 =default出现是因为,在C++11 中可以使用类内初始值。构造函数在调用前都会使用类内初始值进行初始化。此时无参构造函数就没什么意义了,并且在提供了其它构造函数的情况下,编译器不会默认生成构造函数,但是如果你又想使用构造函数,那么你就需要自己写。为了避免写麻烦 所以就直接使用 =default,更加方便且还有一个提示作用。告诉程序员此构造函数使用编译器默认生成的构造函数

构造函数初始值列表

名字很重要 写三遍 构造函数初始值列表 构造函数初始值列表 构造函数初始值列表 。 类内初始化 类内初始化 类内初始化 类内初始化 构造函数初始值列表是形如如下的结构

Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(n * p) {}

构造函数初始值列表是真的初始化,在构造函数执行前就初始化了。必须要使用构造函数初始化列表的情况有以下三种。

  1. 初始化类的const成员数据或者引用数据
  2. 在派生类中初始化基类的私有成员
  3. 如果基类没有默认构造函数,那么只有通过构造函数初始化列表去确定基类如何被构造 注意 初始化列表的初始化顺序与 列表的顺序无关,只与数据成员在类中定义出现的顺序有关。

标签:初始化,读书笔记,初始值,默认,列表,编译器,7.1,构造函数
From: https://blog.51cto.com/u_15885923/7068233

相关文章

  • 《深入理解Java虚拟机》读书笔记:垃圾收集器
    垃圾收集器 HotSpot虚拟机包含的所有收集器如图3-5所示。图3-5展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。新生代收集器:Serial、ParNew、ParallelScavenge,新生代收集器均采用复制算法老年代收集器:SerialOld(标记-整理算法)、Paral......
  • 《CUDA编程:基础与实践》读书笔记(5):统一内存编程
    统一内存(unifiedmemory)是一种逻辑上的概念,它既不是显存、也不是主机内存,而是CPU和GPU都可以访问并能保证一致性的虚拟存储器。使用统一内存对硬件有较高的要求:对于所有功能,GPU架构都必须不低于Kepler架构,主机应用程序必须为64位。对于一些较新的功能,至少需要Pascal架构的GPU......
  • 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题
    四、如何修改QUICKSORT,使得它能够以非递增序进行排序?文心一言:快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计。默认情况下,快速排序会以递增序进行排序。若想修改快速排序以实现非递增排序,我们需要调整比较和交换的逻辑。以下是修改后的非递增快速排序的Python代码......
  • golang 构造函数的应用
    在Go语言中,没有类似于传统面向对象编程语言中的构造函数的概念。然而,你可以使用初始化函数来达到类似的效果。在Go中,结构体(struct)是一种用于封装一组相关字段的数据类型。你可以为结构体定义一个初始化函数,该函数在创建结构体实例时自动调用,用于设置字段的初始值。这个初始化函数......
  • Cisdem Video Converter for Mac(视频转换工具) 7.10.0中文版
    CisdemVideoConvertermac是一款视频转换软件,它可以将各种常见格式的视频文件转换为其他格式,并提供了多种编辑和调整功能。CisdemVideoConvertermac软件特点-支持批量转换:用户可以同时转换多个视频文件,极大地提高了工作效率。-高质量输出:CisdemVideoConverter支持输出高质......
  • [Unity]为什么不要在Unity中使用构造函数
    MonoBehaviour派生出来的类会作为Unity3D中的Component挂载在GameObject上,而GameObject会在编辑器的多个地方被显示,如场景编辑器内、Prefab选中时等,这些时候都需要调用它们的构造函数来初始化成员变量的默认值,以便在编辑器中显示它们,也就是说,构造函数的调用次数和调用时机是“完全......
  • C++ 构造函数初始化:提高代码可读性和执行效率
    在C++中,构造函数是用来初始化对象数据成员的。一个对象在创建的时候,构造函数会被自动调用,以便为该对象的数据成员赋初值。传统的初始化方式是在构造函数内部对数据成员逐一进行初始化,这种方式虽然可行,但是代码复杂度高且效率低下。本文将介绍如何使用构造函数初始化列表来提高......
  • 《CUDA编程:基础与实践》读书笔记(4):CUDA流
    1.CUDA流一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列。除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者。一个CUDA流中的各个操作按照主机发布的次序执行;但来自两个不同CUDA流的操作不一定按照某个次序执行,有可能是并发或者交错地执行。任何CUDA操作......
  • 《深入理解Java虚拟机》读书笔记:垃圾收集算法
    由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程。垃圾收集算法概要 1、标记-清除算法标记-清除算法最基础的收集算法是“标记-清除”(Mark-Sweep)算法,算法分......
  • ApacheCN 活动汇总 2019.7.19
    组织任务翻译校对活动MIT18.03写给初学者的微积分【校对】参与方式:https://github.com/apachecn/calc4b-zh/blob/master/CONTRIBUTING.md整体进度:https://github.com/apachecn/calc4b-zh/issues/1项目仓库:https://github.com/apachecn/calc4b-zh认领:9/74,校对:0/74章节贡献者进度第......