初始化列表

article/2025/10/15 21:55:27

前言

 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能成作初始化。因为初始化只能进行一次,而构造函数体内可以多次赋值。

一,初始化列表

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}private:int _year;int _month;int _day;
};

二,初始化列表使用事项:

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次

2. 类中包含以下成员,必须放在初始化列表位置进行初始化: 
  • 引用成员变量
  • const成员变量
  • 自定义类型成员 (且类无默认构造函数)
class A {
public:A(int a):_a(a){}
private:int _a;
};class B {
public:B(int a, int ref):_b(a), _r(ref), _n(10){}
private:A _b;    // 没有默认构造函数int& _r;   // 引用const int _n;  // const 
};
引用成员变量,const成员变量, 无默认构造函数的 自定义类型成员变量不能先定义再初始化,它们在初始化列表内定义,并且必须在定义时就初始化,因此必须在初始化列表内初始化。
3,尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,
一定会先使用初始化列表初始化
class Time
{
public:Time(int hour = 0):_hour(hour){cout << "Time()" << endl;}private:int _hour;
};class Date
{
public:Date(int day){}private:int _day;Time _t;
};
int main()
{Date d(1);
}
4,成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后
次序无关

下面程序的运行结果是( )  ?

class A {
public:
    A(int a)
        :_a1(a)
        , _a2(_a1)
    {}

    void Print() {
        cout << _a1 << " " << _a2 << endl;
    }

private:
    int _a2;
    int _a1;
};

int main()
{
     A aa(1);
     aa.Print();
}

A. 输出1  1

B. 程序崩溃
C. 编译不通过
D. 输出1  随机值

 答案当然是D啦,因为成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关嘛。

a2在下,a1在上,a2初始化时a1还未被初始化,a1仍是随机值,所以a2为随机值,a1则为1。

三,explicit关键字

1. 隐式类型转换

 double b = i;并不是将i直接赋值给b,而是用i创建了一个临时变量,再将临时变量赋值给b,i的值并未改变,

2. 避免单参构造函数的隐式类型转换

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

打个栗子:

class Date
{
public:// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用Date(int year):_year(year){}// 2. 虽然有多个参数,但是创建对象时后两个参数可以不传递,没有使用explicit修饰,具有类型转换作用Date(int year, int month, int day): _year(year), _month(month),_day(day){}Date& operator=(const Date& d){if (this != &d){ _year = d._year;_month = d._month;_day = d._day;}return *this;}      private:int _year;int _month;int _day;
};int main()
{Date d1(2022);d1 = 2023;return 0;
}

d1 = 2023;同样发生隐式类型转换,编译器用d1对象构造了一个临时对象,用2023初始化该对象,再用临时对象去对d1进行拷贝构造。即先构造,再拷贝构造。这样悄悄发生的事情, 有时可以带来便利, 而有时却会带来意想不到的后果.

c++提供了关键字explicit,禁止通过构造函数进行的隐式转换。声明为explicit的构造函数不能在隐式转换中使用。可以避免不合时宜的类型变换。

使用事项:

  1. explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了
  2. 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数
  3. 当类的声明和定义分别在两个文件中时,explicit只能写在在声明中,不能写在定义中
  4. 将拷贝构造函数声明成explicit并不是良好的设计,一般只将有单个参数的构造函数声明为explicit,而拷贝构造函数不要声明为explicit

http://chatgpt.dhexx.cn/article/plqLn8aX.shtml

相关文章

Java 初始化 List 的几种方法

最常见的初始化 List 方法为&#xff1a; List<String> languages new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println(languages);但是实际上&#xff0c;我们并不会…

LIST集合初始化及常见方法

目录 1.ArrayList集合的初始化&#xff1a; 2.常用的List集合方法&#xff1a; 1.添加元素方法 2.查看&#xff08;遍历元素&#xff09;&#xff1a; 3.修改元素&#xff1a; 4.删除元素&#xff1a; 5.其他的常见方法&#xff1a; 1.ArrayList集合的初始化&#xff1a;…

微信小程序上传图片怎么限制大小

最近有一个微信小程序的项目&#xff0c;要求是上传多张图片&#xff0c;数量不能超过3张 &#xff0c;而且在php里因为上传图片被设置了只能上传2M&#xff0c;导致上传不成功&#xff0c;所以我在前端 设置一个函数&#xff0c;用了微信api(wx.chooseImage)获取图片&#xf…

微信小程序 import文件大小限制

微信小程序 import 引入外部文件 最大限制 超过 500k 时小程序会报错 当 import 引入的文件小于 500k 20200317补充: 后来有尝试了一下 echart ,发现引入的文件也大于500k,但是并没有出现报错, 我十分怀疑是json 的长度过长导致的, 如果有人知道是什么原因,希望不吝赐教.

【微信小程序】解决代码上传超过大小限制

问题描述 代码上传时失败&#xff0c;原因是大小超过限制 解决办法 一、图片等静态资源占用大&#xff0c;导致大小超限制 方法1&#xff1a;使用云开发提供的储存功能【推荐】 注意&#xff1a;要开通云开发功能&#xff0c;其次要在app.js中调用wx.cloud.init方法使用云开…

小程序分包Error: 分包大小超过限制,main package source

问题: 1、根据开发需求,项目基础模块开发完成后,在微信开发者工具上预览正常,点击"预览"的时候,提示分包大小超过限制。 如图: 上官网查了下,目前小程序分包大小有以下限制: 请参考:https://developers.weixin.qq.com/miniprogram/dev/framework/subpack…

uniapp下微信小程序超过2MB大小限制的解决方法

小程序开发者们看到这样的错误是不是很头疼&#xff1f; 我来总结一下解决这个问题的 方法 微信小程序超过2MB大小限制 1压缩静态文件大小2缩减大量重复的css代码3注释掉pages.json某些代码4程序分包5不要在uni.scss中引用样式&#xff01; 1压缩静态文件大小 举例&#xff0c…

小程序打包体积优化策略

背景 我们都知道微信小程序有包体积限制&#xff0c;整个小程序所有分包大小不超过 20M&#xff0c;单个分包/主包大小不能超过 2M。然而面对业务的不断更新迭代&#xff0c;代码和资源会越来越多&#xff0c;如果不尽早规划包体积的治理&#xff0c;势必有一天会对业务的发展…

【微信小程序】解决代码上传超过大小限制,小程序分包

微信小程序分包 小程序项目更新迭代&#xff0c;代码越来越大&#xff0c;超过了2M&#xff0c;小程序不能发布 快速解决方案&#xff0c;原来的页面跳转都不需要改&#xff0c;只需要改变app.json文件 原来app.json内容 {"pages": ["pages/ucenter/feedbac…

微信小程序页面数量限制问题

今天记录一下微信小程序关于页面栈不够用的解决方法&#xff0c;这个方法我是从小程序开发书中习得 1.问题 首先微信小程序中页面栈最多十层&#xff0c;也就意味着如果使用wx.navigateTo&#xff08;保留当前页面&#xff0c;跳转到应用内的某个页面&#xff09;方法&#x…

微信小程序获取头像昵称,限制头像大小

把用户的头像上传&#xff0c;限制在2M以内 代码 that.onChooseAvatar (e) > {console.log(onChooseAvatar2, e);const avatarUrl e.target.avatarUrl;let FileSystemManager wx.getFileSystemManager()FileSystemManager.getFileInfo({"filePath": avatarUr…

linux怎么限制文件大小,Linux文件系统文件大小限制

去阿里面试,被问到了Linux文件系统中文件大小的限制,当时就无语了。学操作系统时这些都是现算的,回来赶紧查一下。 以下为红帽ext3文件系统所支持的max file size和max filesystem size: ext3文件系统最大支持块数是2的32次方。块的大小可变,直接影响了文件系统的大小和文…

小程序包大小超过限制

uniapp&微信小程序主包/分包大小超过限制 一、开启分包1.在pages.json文件中配置分包2.在manifest.json文件中配置一下分包优化 二、以压缩方式运行1.在pages.json文件的顶部配置一条运行脚本(不清楚实际有没有生效)2.找到package.json文件 三、一些小建议1.一些图片文档之…

微信小程序文件大小限制

项目场景&#xff1a; 今天接着学习微信小程序&#xff0c;因为导入到项目的图片稍微多了一点&#xff0c;导致微信小程序无法编译&#xff0c;弹出以下错误。 经查找原因后才发现&#xff0c;原来微信小程序对每个小程序有大小限制&#xff0c;最多2M&#xff0c;进行分包后最…

socket中的函数遇见EINTR的处理

转载 &#xff1a; https://blog.csdn.net/benkaoya/article/details/17262053 http://blog.chinaunix.net/uid-21501855-id-4490453.html 这几天&#xff0c;写服务器代码过程当中&#xff0c;遇见EINRT信号的问题&#xff0c;我是借鉴 《unp 》&#xff0c;采用continue或者…

系统调用中断(EINTR)与SIGCHLD信号的处理

一、被中断的系统调用(EINTR)的理解 1. 慢系统调用是&#xff1f;2. 慢系统调用的类别3. EINTR产生的原因5. 一般处理方法 二、SIGCHLD信号的处理 1. SIGCHLD信号的产生2. SIGCHLD信号的处理3. 不处理SIGCHLD的后果 三、示例代码 一、被中断的系统调用(EINTR)的理解 1. 慢…

StringUtils 工具

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>实验室&#xff1a; 常用方法&#xff1a; StringUtils.truncate("abcdefg", 7);StringUtils.wrapIfMissing("ab&…

StringUtils

今天我来谈一下Java里面一个工具类StringUtils&#xff0c;其实在Java里面一般把工具类写成静态的&#xff0c;这样是为了在使用的时候好调用。但是StringUtils这个类在Java API文档是没有的&#xff0c;所以必须要去倒StringUtils所属于的jar包。而StringUtils所属于的jar包是…

使用Python websockets搭建互联网服务器

在上一篇文章中实现局域网的通信&#xff0c;使用websockets,python作服务端&#xff0c;unity作客服端完成网络通信 这次准备实现互联网上的通信。 1.整个云服务器 要实现互联网通信&#xff0c;简单的方法就是先准备一个云服务器&#xff0c;这里我直接使用了阿里云服务器。…

【ZED2-3】python同时实现websockets与flask

上篇博客【ZED-2】基于WebSockets库&#xff0c;通过多线程方式推送数据流_WXG1011的博客-CSDN博客采用多线程方式&#xff0c;基于websockets库实现数据流的推送&#xff0c;这篇博客主要实现将前端&#xff08;nx板&#xff09;代码移植到flask框架中&#xff0c;通过http方式…