Translator
 
 
Translator
 
 

参考链接:

https://blog.csdn.net/XIONGXING_xx/article/details/115553291
https://blog.csdn.net/W_Y2010/article/details/120242653
https://blog.csdn.net/baidu_41388533/article/details/109489401

C++编译过程中类的构造过程:

1.对象将在参数列表,就是括号内的代码执行前,给成员变量分配内存;

2.程序流程进入括号内,使用常规的赋值方式将值存储到内存中;

3.进入构造体函数中进行赋值和计算;

这个过程就会引发一些问题:

1)成员变量是一个const对象,那么在分配内存后就不能进行赋值;

2)成员变量是一个引用过对象,构造后也不能被赋值,因此必须在创建时就进行初始化;

3)成员变量是一个类,这个类没有无参构造函数,在初始化时,没有办法进行构造;

4)子类在初始化父类的私有成员时;

实际就是部分成员在初始化和复制操作分开后,会出现问题;

c++提供了一个针对此类问题的解决方法,成员初始化列表。

成员初始化列表:

对于构造函数而言,C++提供了两种变量初始化的方式,在构造器的函数内,在初始化列表中;

class Test
{
private:
string m_str;
const int m_age;
public:
Test(const string &s, int i):m_str(s),m_age(i);

注意事项:

1.编译器会根据类声明的参数顺序去进行执行,和初始化列表里的顺序无关;

2.初始化列表里的代码执行,是在构造函数体之前进行执行的;

高效性:

直接在构造函数内进行初始化时,会把参数进行拷贝构造,生成临时对象,把临时对象赋值给成员变量,再析构它;

而使用成员初始化列表则直接进行成员变量的构造,少了临时对象生成的步骤;

个人学习记录-Cpp基础-成员初始化列表的更多相关文章

  1. C++:用成员初始化列表对数据成员初始化

    1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{ private: double real; double imag; public: Co ...

  2. C++类的成员初始化列表的相关问题

    在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list): 1,初始化一个引用成员(reference member): 2,初始化一个常量 ...

  3. C++: 类成员初始化列表语法

      类的成员初始化列表的初始化的基本语法,类的构造函数还可以运用此语法为其变量初始化: class Class { private: int a; int b; char ch; public: Cl ...

  4. C++ 成员初始化列表

    1.什么是成员初始化列表 #include<iostream> #include<string> using namespace std; class Weapon { pri ...

  5. C++的成员初始化列表和构造函数体(以前未知)

    成员的初始化列表和构造函数在对成员指定初值方面是不一样的.成员初始化列表是对成员初始化,而构造函数,是对成员赋值 成员初始化列表使用初始化的方式来为数据成员指定初值, 而构造函数的函数体是通过赋值的方 ...

  6. C++中成员初始化列表的使用

    C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...

  7. (转) C++中成员初始化列表的使用

    C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...

  8. c++类 用冒号初始化对象(成员初始化列表)

    c++类 用冒号初始化对象(成员初始化列表) 成员初始化的顺序不同于它们在构造函数初始化列表中的顺序,而与它们在类定义中的顺序相同 #include<iostream> ; using n ...

  9. C++ 使用成员初始化列表的一个小坑

    注意在成员列表中初始化的顺序并不是列表顺序 而是: 在类中声明的顺序! EventLoop::EventLoop() :looping(false), quit(false),_tid(curThre ...

随机推荐

  1. 【freertos】009-任务控制

    目录 前言 9.1 相对延时 9.1.1 函数原型 9.1.2 函数说明 9.1.3 参考例子 9.2 绝对延时 9.2.1 函数原型 9.2.2 函数说明 9.2.3 参考例子 9.3 获取任务优先 ...

  2. UniqueMergeTree:支持实时更新删除的 ClickHouse 表引擎

    UniqueMergeTree 开发的业务背景 首先,我们看一下哪些场景需要用到实时更新. 我们总结了三类场景: 第一类是业务需要对它的交易类数据进行实时分析,需要把数据流同步到 ClickHouse ...

  3. Hyper-v安装虚拟机,提示the image's hash and certificate are not allowed错误的解决方法

    本文迁移自Panda666原博客,原发布时间:2021年3月29日. Hyper-v安装虚拟机,提示the image's hash and certificate are not allowed错误 ...

  4. 万字剖析Ribbon核心组件以及运行原理

    大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码.本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果 ...

  5. 【由浅入深_打牢基础】HOST头攻击

    [由浅入深_打牢基础]HOST头攻击 前几天一直准备别的事情,然后用了2/3天时间去挖了补天某厂的SRC,还是太菜了,最后提交了一个低危(还没出结果,还有点敏感信息泄露,感觉略鸡肋也没交),不过偶然发 ...

  6. JavaScript做简单的购物车效果(增、删、改、查、克隆)

    比如有时候遇到下面这种情况,点击加入购物车,然后在上方的购物车中动态的添加商品以及商品的信息,我们就可以通过JavaScript实现简单的这些操作. 首先我们需要在html文档中,通过css对页面的布 ...

  7. Python:一个闹钟

    随着一个<霍格沃茨:一段校史>风格的大字(呃,这字好像并不大--)标题的出现,无聊的我没事干,又开始整活了~ 之前我做的程序,一个使用了Tkinter库,一个则是Pygame,总之都是带有 ...

  8. 梯度下降算法实现原理(Gradient Descent)

    概述   梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的,所谓的通用就是很 ...

  9. Map集合中的同一键值key重复赋值

    前言: 验证:对Map集合中的同一键值key重复赋值? 结果:对Map集合中的同一键值key重复赋值会覆盖之前的结果. 验证如下: Map<String, Object> map = ne ...

  10. gerrit系统如何配置访问控制

    . 版本:v0.3 作者:河东西望 日期:2022-7-13 . 目录 1 关键概念 2 需求场景 3 配置策略 gerrit系统的上手使用有两个难点: 部署repo仓库. 配置访问控制. 想要上手使 ...