构造函数初始化列表和函数内部赋值的区别

C++的成员初始化列表 成员初始化列表是C++中类构造函数的一部分,它允许在构造函数体之前初始化类的成员变量。相比于在构造函数体内赋值,成员初始化列表有更高效的性能,特别是在初始化常量成员、引用成员和基类时至关重要。成员初始化列表的执行顺序并不是按列表中的书写顺序,而是按照成员变量在类中声明的顺序。常量成员变量一旦声明,必须被初始化,且在之后不能更改。对于自定义类型成员变量,使用成员初始化列表可以避免不必要的默认构造和赋值操作,提升代码性能。必须在初始化列表中初始化,因为它们只能在对象创建时被赋值,不能在构造函数体内赋值。 阅读详情

转自:http://www.cnblogs.com/BlueTzar/articles/1223169.html

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

class  CExample  {
public:
    
int a;
    
float b;
    
//构造函数初始化列表
    CExample(): a(0),b(8.8)
    
{}
    
//构造函数内部赋值
    CExample()
    
{
        a
=0;
        b
=8.8;
    }

}
;

上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。

初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:
1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
2.
const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。 

初始化数据成员与对数据成员赋值的含义是什么?有什么区别?
首先把数据成员按类型分类并分情况说明:
1.内置数据类型,复合类型(指针,引用)
    在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
2.用户定义类型(类类型)
    
结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)

Note:
初始化列表的成员初始化顺序:
    C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。
    Example:

class  CMyClass  {
    CMyClass(
int x, int y);
    
int m_x;
    
int m_y;
}
;

CMyClass::CMyClass(
int  x,  int  y) : m_y(y), m_x(m_y)
{
}

你可能以为上面的代码将会首先做m_y=I,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。


通过成员初始化列表来进行初始化总是合法的,效率也决不低于在构造函数体内赋值,它只会更高效。另外,它简化了对类的维护。因此,尽量使用初始化列表,但有一个情况是例外的:

这就是当有大量的固定类型的数据成员要在每个构造函数里以相同的方式初始化的时候:

private:
  int a, b, c, d, e, f, g, h;
  double i, j, k, l, m;
像这样讨厌而枯燥的初始化工作就交给函数体内赋值吧

C++子类的构造、析构和拷贝函数 C++子类的构造、析构和拷贝函数子类的构造子类的析构子类的拷贝构造函数 子类的构造 子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数 1、默认执行父类的无参构造。 2、显式调用有参构造,在子类的构造函数后,初始化列表中显示调用父类对的有参构造函数 class Base { public: char* str; Base(void) { cout << "无参... 阅读详情

相关推荐

C++基础用法—函数括号后面加const

C++基础用法—函数括号后面加const一、作用二、示例代码 一、作用 用于申明类中的成员函数为“只读”函数,即函数后面加了const之后该函数不能改变类的数据成员。 因为在类的成员函数中,有一些成员函数不能改变类的数据成员; 已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 提高程序的可读性和可靠性 常量对象相关 二、示例代码 #include <iostream> using namespace std; class aa{ int num;

LiuXF93的博客 5421

C++类构造函数初始化列表

  构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=

徐阳的专栏 1551

【C++】构造函数(初始化列表)、explicit、 Static成员、友元、内部类、匿名对象

构造函数(初始化列表)、explicit、 Static成员、友元、内部类、匿名对象

m0_52347974的博客 673

C++ 成员初始化列表

这里写目录标题数据成员是对象数据成员的类型是const或者引用子类初始化父类的私有成员使用成员初始化列表的优点 在以下三种情况下需要使用初始化成员列表: 需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化); 需要初始化const修饰的类成员或初始化引用成员数据; 子类初始化父类的私有成员; 数据成员是对象 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,

TABE_的博客 3274

快衰落、慢衰落,平坦衰落、频率选择性衰落

目录一、大尺度衰落和小尺度衰落二、平坦衰落和频率选择性衰落1.反射墙、固定天线模型2.相干带宽和时延扩展三、快衰落和慢衰落1.反射墙、运动天线模型2.相干时间和多普勒扩展四、联系总结 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、大尺度衰落和小尺度衰落 移动无线信道的主要特征是信道强度关于时间和频率的变化,大致分两种: 大尺度衰落: .

weixin_45662974的博客 3万+

C语言由scanf(“%d“,)非法输入字符造成的死循环及其解决方案

声明:此文章仅作为C语言学习历程中的思路整理,用于解决入门阶段较为浅显的问题,如有错误还请指正。 现象描述: 代码要求实现用户输入1或2,通过scanf("%d",&a)读取这个值,从而判断分属于1或2的两种情况。输入非1,2的数字都应该返回"Invalid Number!",并且要求重新输入数字。 while(a!=1&&a!=2) { printf("Invalid Number!\n"); printf("Enter the number:"); scan

weixin_49764077的博客 8717

C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的区别

初始化和赋值对内置类型的成员没有什么大的区别,像任一个构造函数都可以。但有的时候必须用带有初始化列表的构造函数: (1) 成员类型是没有默认构造函数的类。若没有提供显式初始化时,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。 (2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。

hyqsong的专栏 4177

树莓派视觉小车实战:OpenCV驱动的智能物体追踪系统

本文详细介绍了如何从零开始构建一个基于树莓派的智能视觉小车,实现物体跟踪功能。通过OpenCV进行图像处理,结合颜色与轮廓识别算法,让小车能够实时锁定并追踪特定目标。内容涵盖硬件搭建、软件环境配置、核心代码解析及运动控制逻辑,为创客和开发者提供了完整的实战指南。

weixin_29047545的博客 142

C++类与对象 下(构造函数——初始化列表,static成员,友元,内部类)

2.初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量, 一定会先使用初始化列表初始化 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化 2.特性 1. 静态成员为所有类对象所共享,不属于

2301_79180415的博客 2107

UG二次开发GRIP创建drill工序

UG二次开发GRIP创建drill工序

qq285503851的博客 1694

CKA-CN考试之路----16

所以结合本题,如果有多个文件中都存在同一个值,务必统一,或者修改最后一个次序的文件。中以不同的文件名来区分不同目的的配置会更有利于阅读.就像本题中的。但当有多个文件中存在同一个参数的不同值,最后会生效哪个值?中,但随着配置越来越多不怎么容易阅读.当多个文件同时存在一个参数,但值又不同。有时候我们会将所有内存参数全部写在。确认服务状态(2个红框中的内容)

Q先生 299

c++类成员变量初始化详解

1.类初始化顺序 当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。 注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。 2.声明时初始化 第一种方式是在成员变量声明时初始化。可以看如下示例。 class D { int a = 10; }; 在声明变量a的时候即给其初始化为10。不过注意这种写法是c++1

bitcarmanlee的博客 2万+

097、Zephyr RTOS驱动开发实战:传感器驱动(陀螺仪)

I2C速率别设太高:LSM6DSO支持最高400kHz,但实际布线有寄生电容时,400kHz容易出错。工业产品我统一用100kHz,稳定压倒一切。FIFO水印值要计算:假设ODR=6.66kHz,每150us产生一组数据,如果水印设32组,则每4.8ms触发一次中断。这个间隔要大于I2C读取耗时(实测约200us),否则中断堆积。电源纹波敏感:陀螺仪对电源噪声敏感,特别是3.3V供电时。我遇到过因为DC-DC纹波太大,陀螺仪输出噪声从0.1dps飙升到2dps。

m0_50546716的博客 118

【C++初阶#7】:初始化列表 & static & 友元 & 内部类

这篇文章是关于构造函数的更一步了解,以及对 static 和友元的了解,最后还了解了内部类的相关知识

island1314的博客 1811

计算机视觉入门:从像素到理解的旅程

计算机视觉入门:从像素到理解的旅程,计算机视觉是人工智能领域的核心方向之一,旨在让计算机具备理解和解释视觉信息的能力。本文以系统化的知识框架,结合 Python 代码与经典案例,带您从像素级操作逐步掌握计算机视觉核心技术。涵盖图像处理、特征工程、传统机器学习到深度学习模型,助您构建从基础到进阶的完整能力体系。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++的构造函数的作用:初始化类对象的数据成员

即类的对象被创建的时候,编译系统对该对象分配内存空间,并,完成类成员的初始化。C++的构造函数可以有多个,创建对象时编译器会根据传入的参数不同调用不同的构造函数。构造函数的特点以类名作为函数名,无返回类型。...

呆呆象呆呆的博客 2933

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++】类和对象4(初始化列表、静态成员、内部类)

文章目录一、再谈构造函数1.构造函数体内赋值2.初始化列表(1)格式(2)用处3.静态成员二、类成员默认值(C++11)三、内部类感谢阅读,如有错误请批评指正 一、再谈构造函数 1.构造函数体内赋值 在创建对象时,编译器自动调用构造函数,给对象中各个成员变量一个合适的初始值。 代码如下(示例): class Date { public: Date(int year, int month, int day) { _year = year; _month = month; _day = day

weixin_51983604的博客 764

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

c++基础语法(构造函数初始化列表)

转载:http://blog.youkuaiyun.com/yili_xie/article/details/4803428 C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:         如果我们有一个类成员,它本身是一个类或

Keep Moving 507

C++类与对象(构造函数体赋值)

构造函数体赋值 之前学习了解到,在创建对象的时候,编译器会通过调用构造函数,给对象中的各个成员变量赋一个合适的初始值。 class d { pubilc: d(int a,int b,int c) { _a = a; _b = b; _c = c; } private: int _a; int _b; int _c; }; 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只

qq_44819750的博客 2279

C++ 类和对象(3)初始化列表、友元函数、内部类

在定义时就必须进行初始化的变量类型,就必须放在初始化列表进行初始化。3.C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的4.

fallzzzzz的博客 883

c++ 初始化列表

c++ 构造函数初始化列表

一个老菜鸟的学习分享 1228

【C++初阶】类和对象(下)再谈构造函数、static成员、C++11的成员初始化新玩法、友元类、内部类

类和对象(下)再谈构造函数、static成员、友元、内部类、

m0_67077469的博客 523

初始化列表

class CExample { public: int a; float b; //构造函数初始化列表,初始化列表先于构造函数进行。 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } ...

weixin_30455067的博客 76

C++构造函数和静态成员、友元

在创建对象时,编译器会调用构造函数对对象进行初始化工作。对象的初始化有两种方式,一种是构造函数体赋值另一个是初始化列表。

m0_73928695的博客 440
上一篇: C++实现Singleton设计模式
下一篇: 使用python输出pdf
C__Allen
博客等级 码龄18年 12粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值