初始化列表

文章目录

  • 一. 初始化列表是什么?
  • 二. 为什么要有初始化列表?
  • 三. 初始化列表的特性
  • 四. explicit关键字
  • 五. statis成员
  • 六. 友元
  • 七. 内部类
  • 八. 匿名对象
  • 九. 编译器优化
  • 总结:

一. 初始化列表是什么?

初始化列表是构造函数真正初始化的地方,不管你是否写了构造函数或者是否显示写了初始化列表,构造函数都会走初始化列表,进行对象的初始化;
简单的说:初始化列表就是构造函数真正进行初始化的地方!!!

二. 为什么要有初始化列表?

  1. 语法设置特性就是如此。
  2. 有三种情况必定需要初始化列表进行初始化。
  1. 拥有const 属性的常变量。因为const 初始化之后就不能变了。
  2. 引用类型的变量,因为引用特性初始化之后不能再变成别人的引用了。
  3. 没有默认构造的自定义成员变量。

三. 初始化列表的特性

  1. 初始化列表的使用方式:在构造函数口号后面先加一个 :(冒号),然后写成员变量,再在成员变量后面加括号,括号里面进行初始化,用逗号对后面的成员变量进行分割;
    在这里插入图片描述
  2. 构造函数的初始化顺序是跟成员变量的先后顺序是一样的,如上图所示:要是先定义变量a1,后定义a2,初始化列表就会先初始化a1,后初始化a2,反之就先初始化a2,后初始化a1;要是上图是后者,则a2是任意值,不确定的,因为a2是用a1初始化的,而a2先于a1初始化,这个时候a1还是任意值;
  3. 对于自定义类型和内置类型的区别:
  1. 要是显示写了初始化列表,则直接走初始化列表,不管是内置类型还是自定义类型;
  2. 要是没有显示写初始化列表,内置类型不做处理,自定义类型调用对应的构造函数;这里注意:要是自定义类型没有默认构造函数,编译报错!!!

四. explicit关键字

  1. 可以对一个参数的构造函数进行隐式类型转换,比如string的拷贝构造可以直接用一个字符串直接构造 如 string s = “hello world”;这样看上去想赋值重载,其实是拷贝构造,而且拷贝构造的参数是string类型,但是这里直接是字符串,这里就是会隐式类型转换,也可以参数是int类型的,直接传一个整数常量,也是一样的;
  2. 要是不要它进行隐式类型转换,在构造函数前面加上explicit关键字就可以禁止!!!

五. statis成员

  1. 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化(const修饰的整形类型可以用缺省值)
  2. statis成员是所有对象共享的,无论是成员变量还是成员函数;它是存放在静态区的。
  3. statis修饰的成员变量一定要类外初始化,不用加statis关键字,类中的只是声明。
  4. statis修饰的成员可以直接用类名::成员访问(前提是公有),因为它不在对象里;
  5. statis修饰的成员函数没有this指针,故不能访问具体对象的普通成员变量,只能访问statis修饰的成员变量。
  6. 静态成员同样受访问限定符的影响

六. 友元

  1. 友元分友元函数和友元类。
  2. 友元函数是普通函数,在类内任意地方,注意:是类内任意地方!!!将需要用私有和保护成员的普通函数前面加friend关键字的声明放在类内任意地方就行了。
  3. 一个函数可以是多个类的友元。
  4. 友元类是单向的,比如a类是b类的友元,则a类可以访问b类的所有成员,而b类还是只能访问a类的公有成员。
  5. 友元类不能传递,很好理解的,c是b的友元,b是a的友元,但是c不是a的友元。

七. 内部类

  1. 在类里面定义的类叫内部类。
  2. 内部类天然是外部类的友元。
  3. 我们可以看作内部类和两个定义在全局的类是一样的,sizeof(类名)大小是外部类的大小,跟内部类没有关系
  4. 只是访问内部类的时候会受外部类的范围限定符的影响。

八. 匿名对象

  1. 直接用 类名() 这样形式使用匿名对象,也就是没有对象名。
  2. 匿名对象只能在当前所在行使用!!!
  3. 如果是单参数构造,又可以使用隐式类型转换,简化到了极致。

九. 编译器优化

  1. string s = “hello world”,本来是先构造一个临时string,然后再拷贝构造的,编译器直接优化成用”hello world" 构造s。
  2. 传参的时候直接传一个string对象,第一个可以优化是直接传一个匿名对象,本来是要构造一个匿名对象,然后再拷贝构造参数,编译器直接用匿名对象的参数直接构造string。
  3. 还有一个就是返回值,返回值直接接收的话也会省掉中间拷贝构造,直接用返回值构造。

总结:

  • 语法确实杂和多,但是要理解它,不要背,坚持下去

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 输入法demo

背景: 一个简单的android输入法demo,支持输入png、gif,jpeg、webp等格式。 此示例演示如何编写一个应用程序,该应用程序接受使用 Commit Content API 从键盘发送的丰富内容(例如图像)。 用户通常希望通过表…

unity 之 如何获取父物体与子物体

文章目录 获取父物体获取子物体 获取父物体 在Unity中,你可以使用Transform组件的属性来获取对象的父物体。以下是在C#脚本中如何获取父物体的示例代码: using UnityEngine;public class GetParentExample : MonoBehaviour {void Start(){// 获取当前物…

C#调用barTender打印标签示例

使用的电脑需要先安装BarTender 我封装成一个类 using System; using System.Windows.Forms;namespace FT_Tools {public class SysContext{public static BarTender.Application btapp new BarTender.Application();public static BarTender.Format btFormat;public void Q…

六、事务-4.并发事务问题

一、脏读 事务A执行3个操作,第1个操作执行select语句,第2个操作执行update语句。 注意:事务没有执行完成的时候,事务是没有提交的。只有事务的3个操作完成之后,事务才会提交。 但事务A中第2个操作,会把表…

Python 面试:异常处理机制

格式: 继承Exception实现自定义异常。 注意:这里是继承Exception类,而不是BaseException类,因为继承BaseException可能会导致捕获不到自定义异常。 class MyException(Exception):passtry:raise MyException(my salary is too…

优化案例5:视图目标列改写优化

优化案例5:视图目标列改写优化 1. 问题描述2. 分析过程2.1 目标SQL2.2 解决思路1)效率低的执行计划2)视图过滤性3)查看已有索引定义 2.3 视图改写2.4 增添复合索引 3. 优化总结 DM技术交流QQ群:940124259 1. 问题描述…

『PyQt5-Qt Designer篇』| 06 Qt Designer中水平布局和垂直布局的使用

06 Qt Designer中水平布局和垂直布局的使用 1 水平布局1.1 按钮布局1.2 位置移动1.3 先布局再放按钮1.4 保存文件并调用2 垂直布局2.1 按钮布局2.2 保存并调用1 水平布局 1.1 按钮布局 拖动几个按钮: 选中这几个按钮,右键-布局-水平布局: 可以看到按钮间隔等宽水平排列: 也…

Linux线程控制

目录 一、线程的简单控制 1.多线程并行 2.线程结束 3.线程等待 (1)系统调用 (2)返回值 4.线程取消 5.线程分离 二、C多线程小组件 三、线程库TCB 1.tid 2.局部储存 一、线程的简单控制 1.多线程并行 我们之前学过pt…

使用openpyxl来创建一个月的日程表

首先你心里要有一张表的样子,openpyxl才能帮你创建出其余的29张。 import openpyxl from openpyxl.styles import Alignment, Font import calendar from datetime import datework_path rXX\YY\ZZ\日报-九月.xlsxtry:workbook openpyxl.load_workbook(work_path…

AttributeError: ‘ConfigDict‘ object has no attribute ‘log_level‘

运行 python tools/train.py configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py 时出现 问题 Traceback (most recent call last):File "tools/train.py", line 242, in <module>main()File "tools/train.py", line 167, in mainlogger get_ro…

基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的仓库商品管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经…

GPU编程(基于Python和CUDA)(二)——显示GPU信息

系列文章目录 GPU编程&#xff08;基于Python和CUDA&#xff09;&#xff08;一&#xff09;——零基础安装pycuda GPU编程&#xff08;基于Python和CUDA&#xff09;&#xff08;二&#xff09;——显示GPU信息 显示GPU信息 系列文章目录前言通过CUDA查看GPU信息使用pycuda查…