C++对象模型(17)-- 构造函数语义学:成员初始化列表

news2024/11/19 5:36:36

1、必须用初始化列表的场景

(1)成员变量是引用类型,必须在初始化列表中初始化。

(2)成员变量是const类型,必须在初始化列表中初始化。

(3)如果类继承自一个父类,并且父类中有带初始化列表的构造函数,必须在初始化列表中初始化父类。

class Base {
public:
    Base(int i) { }
};

class Derive:public Base {
public:
    Derive(int i) : Base(i){}
};

(4)成员变量是类类型,且这个类的构造函数带参数。

class Item {
public:
    Item(int i) { }
};

class MyDemo {
public:
    MyDemo(int i) : item(i){}

    Item item;
};

2、初始化列表的执行时机

初始化列表是在构造函数之前执行的。

我们可以用下面的代码来验证:

class Item {
public:
    Item() { }
    Item(const Item& _item) {
        cout << " Item拷贝构造函数" << endl;
    }
};
class Derive {
public:
    Derive() { cout << " Derive默认构造函数" << endl; }
    Derive(Item& _item) : item(_item) { cout << " Derive带初始化列表构造函数" << endl; }

    Item item;
};

int main()
{
    Item _item;
    Derive derive(_item);

    return 0;
}

执行结果如下:

从运行结果看,初始化列表是在构造函数之前运行的。

3、按成员变量的声明顺序初始化,而不是根据初始化列表中的前后顺序。

class X{
public: 
    X(int val) : j(val), i(j){}
private:
    int i;
    int j;
}

其实在这个时候,构造函数是这么初始化的:

X::X(int val){
    i = j;
    j = val;
}

所以最终的结果是j = val, 但i的值未知。

4、初始化列表的优点

一般地,放在构造函数初始化列表中进行初始化,比放在构造函数中初始化效率更高。

我们可以通过代码来验证这个结论:

(1)构造函数中初始化

class Item {
public:
    Item() { 
        cout << " Item默认构造函数" << endl; 
    }

    Item(int i) { 
        cout << " Item(int)构造函数" << endl; 
    }

    Item(const Item& _item) {
        cout << " Item拷贝构造函数" << endl;
    }

    Item& operator = (const Item& _item) {
        cout << " Item拷贝赋值运算符" << endl;

        return *this;
    }
};

class Derive {
public:
    Derive(int i){ 
        item = Item(i);
        cout << " Derive带初始化列表构造函数" << endl; 
    }

    Item item;
};

int main()
{
    Derive derive(2);

    return 0;
}

运行结果:

(2)初始化列表中初始化

Derive(int i) : item(i){}

运行结果:

可以看到,初始化列表初始化时少了1次默认构造函数和1次拷贝赋值运算符。

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

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

相关文章

跨境商城源码部署(无货源模式,多语言,多货币)

在互联网发展的背景下&#xff0c;跨境电商成为了全球贸易的重要形式之一。跨境商城源码部署是指将跨境电商平台的源代码部署到服务器上&#xff0c;以便搭建一个完整的跨境商城网站。通过部署源码&#xff0c;可以实现无货源模式、多语言和多货币等功能&#xff0c;为用户提供…

Flutter的Constructors for public widgets should have a named ‘key‘ parameter警告

文章目录 问题描述问题原因修改方法详细解释 问题描述 Constructors for public widgets should have a named ‘key’ parameter. 如下图&#xff1a; 原本的代码 class MyTabPage extends StatefulWidget {override_MyTabPageState createState() > _MyTabPageState(…

多测师肖sir_高级金牌讲师___ui自动化之selenium001

一、认识selenium &#xff08;1&#xff09;selenium是什么&#xff1f; a、selenium是python中的一个第三方库 b、Selenium是一个应用于web应用程序的测试工具&#xff0c;支持多平台&#xff0c;多浏览器&#xff0c;多语言去实现ui自动化测试&#xff0c;我们现在讲的Sel…

软件工程与计算总结(二十)软件交付

软件交付是软件项目的结束阶段 &#xff0c;标志着软件开发任务的完成——其作为一个分水岭&#xff0c;区分了软件开发与软件维护两个既连续又不同的软件产品生存状态~ 在经历连续的辛苦工作之后&#xff0c;开发人员在胜利曙光之前难免会忽视软件交付阶段的一些工作——在准…

2022年亚太杯APMCM数学建模大赛C题全球变暖与否全过程文档及程序

2022年亚太杯APMCM数学建模大赛 C题 全球变暖与否 原题再现&#xff1a; 加拿大的49.6C创造了地球北纬50以上地区的气温新纪录&#xff0c;一周内数百人死于高温&#xff1b;美国加利福尼亚州死亡谷是54.4C&#xff0c;这是有史以来地球上记录的最高温度&#xff1b;科威特53…

Shiro安全框架登录验证实例解析

一、Shiro框架简单介绍 Apache Shiro是Java的一个安全框架&#xff0c;旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证&#xff0c;授权&#xff0c;企业会话管理和加密等。Shiro的具体功能点如下&#xff1a; &#xff08;1&#…

即刻报名,企业服务与新经济论坛亮点提前揭秘!

峰会官网已上线&#xff0c;最新议程请关注&#xff1a;doris-summit.org.cn 即刻报名 Doris Summit 是 Apache Doris 社区一年一度的技术盛会&#xff0c;由飞轮科技联合 Apache Doris 社区的众多开发者、企业用户和合作伙伴共同发起&#xff0c;专注于传播推广开源 OLAP 与实…

每日一题 1726. 同积元组(中等,计数)

直接统计数组中的数字两两组合可以得到的乘积求将相同乘积的组合再两两组合的数量最后由于abcd的值可以互换&#xff0c;每一个组合通过呼唤位置可以得到8种不同的组合&#xff0c;所以最后乘以8 class Solution:def tupleSameProduct(self, nums: List[int]) -> int:d de…

【财政金融】全国各地区财政收入与支出面板数据合集(2000-2022年)

数据简介&#xff1a;2000年到2022年中国经历了快速的经济发展和城市化进程&#xff0c;各地区的财政收入和支出也呈现出显著的增长和变化&#xff0c;全国各地区财政收入与支出的面板数据可用于评估经济发展水平和区域差距&#xff0c;通过比较不同地区之间的财政收入和支出水…

MySQL 从一个表中查出数据并插入到另一个表处理方案(详细)

PS&#xff1a;来源表&#xff1a;t_source、目标表&#xff1a;t_target 第一种 来源表和目标表字段完全一致 insert into t_target select * from t_source; 第二种 来源表和目标表字段部分一致&#xff0c;只想导入来源表部分字段到目标表 insert into t_target(字段1,字…

详解自定义类型:结构体,位段,枚举,联合

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.3 特殊的声明 1.4 结构的自引用 1.5 结构体变量的定义和初始化 1.6 结构体内存对齐 1.7 修改默认对齐数 1.8 结构体传参 2. 位段 2.1 什么是位段 2.2 位段的内存分配 2.3 位段的跨平台问题 2.4 位段的应用 3. 枚举…

2023年中国恋爱社区未来发展趋势分析:多元化盈利模式实现可持续发展[图]

恋爱社区指满足情侣之间互动、记录及娱乐需求&#xff0c;以维护情侣恋爱关系的虚拟社区。恋爱社区行业主要以线上APP的虚拟形式为用户提供相关服务&#xff0c;其业务包括情侣记录、情侣互动、情侣娱乐、公共社区、线上购物、增值服务。 恋爱社区主要业务 资料来源&#xff1…

【LeetCode】47. 全排列 II

1 问题 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…

新手如何学习嵌入式Linux?

今日话题&#xff0c;新手如何学习嵌入式Linux&#xff1f;嵌入式底层开发是一项至关重要的技能&#xff0c;广泛应用于各种嵌入式系统中&#xff0c;已经成为我们生活中不可或缺的一部分。因此&#xff0c;学习嵌入式开发变得愈发重要。我这里提供了一份嵌入式学习资料&#x…

ASO优化之增加应用APP安装量的技巧2

我们需要更新应用程序&#xff0c;并且最好以用户会注意到的方式进行更新&#xff0c;季节性或节日的更新非常适合这种情况&#xff0c;例如主题的改变&#xff0c;活动的推出或者是某种折扣。活动是能够让用户相信产品是高质量的关键。 1、应用描述也是优化的一部分。 它是应…

磁珠元器件:微小却强大的科技奇迹 | 百能云芯

在现代科技的背后&#xff0c;有着许多微小而强大的元器件&#xff0c;其中之一是磁珠元器件。尽管它们可能不如计算机芯片或太阳能电池板那样广为人知&#xff0c;但磁珠元器件在各种应用中扮演着重要角色。本文将深入探讨什么是磁珠元器件&#xff0c;它们的工作原理以及在科…

springboot生鲜交易系统springboot46

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

Python爬虫如何设置代理服务器(搭建代理服务器教程)

在Python爬虫中使用代理服务器可以提高爬取数据的效率和稳定性。本文将为您提供搭建代理服务器的详细教程&#xff0c;并提供示例代码&#xff0c;帮助您在Python爬虫中设置代理服务器&#xff0c;实现更高效、稳定的数据抓取。 Python爬虫怎么设置代理服务器&#xff08;搭建代…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅰ—— 生成 CSR

目录 替换拓扑图证书关系示意图说明 & 关联博文 1. 默认证书截图2. 使用certificate-manager生成CSR2.1 创建存放CSR的目录2.2 记录PNID和IP2.3 生成CSR2.4 验证CSR 参考资料 替换拓扑图 证书关系示意图 默认情况下&#xff0c;VMCA 与 Machine SSL的关系是 本系列博文要…

剖析深度学习中的epoch与batch_size关系、代码

目录 前言1. 定义2. 代码 前言 为了区分深度学习中这两者的定义&#xff0c;详细讲解其关系以及代码 1. 定义 在 PyTorch 中&#xff0c;“epoch”&#xff08;周期&#xff09;和 “batch size”&#xff08;批大小&#xff09;是训练神经网络时的两个重要概念 它们用于控…