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

8 篇文章 3 订阅
订阅专栏

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

构造函数可以说是对于C++每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表

一、初始化列表的写法

仍然以之前介绍构造函数时使用的学生类来举例说明:

class Student{
public:
    /*Student(int no, string name, int age){
        _no = no;
        _name = name;
        _age = age;//带参的构造函数
    }*/
    Student(int no, string name, int age)
    	:_no(no)
    	,_name(name)
    	,_age(age)
        {}//初始化列表
private:
    int _no;
    string _name;
    int _age;
};

初始化列表出现了新的部分,以冒号开始,然后紧跟着的是以逗号为分隔符的数据成员列表,每个数据成员后面都有一个括号括号中的是该成员变量的初始值或表达式

二、初始化列表的注意事项

  1. 每个成员变量在初始化列表中只能出现一次,即初始化只会初始化一次,但是在构造函数的函数体中可以进行多次赋值,初始化与赋值的区别有一篇博客写的不错,推荐阅读:

    https://www.cnblogs.com/lxy-xf/p/11049963.html

    初始化的含义是创建变量时赋予它一个初始值,而赋值则是把对象的当前值擦去,用一个新值来代替!(C++primer中的描述)

  2. 当类中包含了:①引用成员变量;②const成员变量;③自定义类型的成员变量(该类没有自己的默认构造函数默认构造函数详解见https://blog.csdn.net/weixin_45523353/article/details/123216917的第四部分)时,必须将这些成员放在初始化列表中进行初始化!

    class A{
    public:
        A(int a){
            _a = a;//有参构造,没有默认构造函数
        }
    private:
        int _a;
    };
    
    class Student{
    public:
        Student(int a, int age)
            :_aa(a)
            ,_age(age)
            ,_no(001)
            {}//必须在初始化列表中进行初始化
    private:
        A _aa;//自定义类型,且没有自己的默认构造函数
        int& _age;//引用
        const int _no//const的成员变量
    };
    
  3. 建议大家尽量使用初始化列表进行初始化,因为自定义类型的成员变量一定会先使用初始化列表初始化,下面这个例子可以帮助理解一下

    class A {
    private:
    	int _a;
    public:
    	A(int a = 0) {
    		_a = a;
    	}
    };
    
    class B {
    private:
    	A _aa;
    	int _b = 1;
    public:
    	B(int a, int b) {
    		_b = b;
    		_aa = A(a);//B这里并没有写出初始化列表
    	}
    };
    int main(){
    	B bb(20,15);//在这里打个断点
        return 0;
    }
    

    按照我们之前的理解,在创建B类型的变量bb时,使用的是B类型所提供的带参的构造函数,但是在监视窗口我们却发现,_b和_aa两个成员变量都已经被初始化了:

    image-20220303230435477

尽管我们没有显式地写出初始化列表,这里也认为是有初始化列表的,其中的两个成员变量会使用默认初始化列表进行初始化,可以认为初始化列表就是对象的成员变量定义的地方。

三、初始化的顺序

非常重要的地方:在初始化列表中的顺序并非成员变量的初始化顺序!,成员变量的初始化顺序只与它在类中的声明次序相同

class A{
    int a1;
    int a2;
public:
    A(int a)
    :a2(a)
    ,a1(a2)
    {}//这里会报编译错误
};

上面的例子虽然看起在初始化列表中先用形参a初始化a2,再用a2初始化a1,但是成员变量的初始化顺序不能看它们在初始化列表中的顺序,而要看的是声明的顺序,a1先于a2声明,因此编译器会先去初始化a1,但此时a2并没初始化,因此a1也就无法初始化了。

所以最好将初始化列表的各个成员顺序与类中的成员变量声明顺序保持一致,而且尽量不要用某个成员变量去初始化另一个成员变量!

C++构造函数初始化列表
灲咲的博客
12-05 3357
构造函数初始化列表 当一个类的成员变量是另一个类的对象时 例: #include<iostream> using namespace std; class A{ public: A() { cout<<"A()"<<endl; } A(int x) { this->x=x; cout<<"A(int x)"&l
构造函数初始化列表
m0_63783532的博客
05-02 4908
一.构造函数初始化列表的基本形式 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表, 每个数据成员后面跟一个放在括号中的初始化式。 student(int m,int n):shengao(m),tizhong(n) { cout<<"初始化"<<endl; } 代码举例: #include<iostream> using namespace std; class student { private: do...
C++构造函数初始化列表
己亥谷雨
11-05 741
初始化列表有几个特性: 1、初始化列表先于构造函数执行 2、初始化列表只能用于构造函数 3、初始化列表可以同时初始化多个数据成员 class Box { public: Box(); Box(int h, int w, int len) :height(h), width(w), length(len) //初始化列表 {} //完全等价于下面这样写 /* Box(int h, int w, int len) { ...
C++构造函数初始化列表
qq_42745340的博客
02-27 319
6-4 C++构造函数初始化列表 上图:实例化过程中不需要传递参数的构造函数称为默认构造函数; 推荐使用初始化列表的方式进行初始化操作; 此时语法错误:const常量m_dPi第二次赋值了; 解决办法:初始化列表: 6-5 初始化列表编码 要求: Teacher.h: #include<string> using namespace std; class Teac...
构造函数初始化列表
qq_63620117的博客
04-17 194
对于成员属性是内置的数据类型如,int,char,string,double等,使用初始化列表,和使用普通的赋值语句区别不大,但是对于类类型的成员,使用初始化列表少了一次调用默认构造函数的过程,而是直接调用拷贝构造,这对于。说明:可以看到a初始化的结果并不是我们想要的,这是因为a成员在类中定义在b成员的前面,所以初始化列表中先初始化a,执行a(a_ * b) ,而b还未初始化,从而导致a出现乱码。因此,如果成员初始化依赖其他成员的值,那么要注意初始化顺序,为了避免这个问题,一般按照定义的顺序初始化成员。
C++ 构造函数初始化列表的好处
12-22
 Derive 类构造函数两个 Base 类型的参数,分别赋给该类两个 Base 类型的成员变量 b1、b2,一个使用初始化列表,一个使用等于号赋值。输出结果如下:  前两行输出是主函数前两行构造 b1、b2 对像时调用的带...
c++ 构造函数初始化列表
12-31
首先,运行下图中的C++代码,输出是...在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与它们在构造函数初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是
C++构造函数初始化列表
12-22
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...
关于C++构造函数初始化成员列表的总结
01-01
1.只能在构造函数初始化列表初始化的成员变量的类型?  a.const成员变量  b.引用类型的成员变量  c.static不能在初始化列表中进行...以上就是小编为大家带来的关于C++构造函数初始化成员列表的总结全部内容了,希望
C++ 构造函数初始化顺序
stashbllog
03-27 4693
构造函数初始化按照如下顺序进行 1. 首先构造虚拟基类,任何虚拟基类的构造函数按照它们被继承的顺序构造; 2. 其次构造非虚拟基类,任何非虚拟基类的构造函数按照它们被继承的顺序构造; 3. 接着构造成员对象,任何成员对象的构造函数按照它们声明的顺序调用; 4. 最后调用类自身的构造函数; 析构函数就无脑的将构造函数顺序反转即可。 接下来举一个简单但是全面的例子帮助理解 #in
C++构造函数初始化列表
zhbi98 的技术 Blogs
12-29 687
我们构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量逐个赋值
成员初始化列表
昔拉的博客
04-19 169
// project100.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <time.h > using namespace std; // //class Base //{ //public: // int ba; // int bb; // B...
c++构造函数初始化列表
sjtu_chenchen的专栏
08-19 977
对象初始化列表出现原因 1) 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。 2) 当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初
c++构造函数初始化列表
最新发布
10-13
C++中的构造函数初始化列表是一种在构造函数初始化成员变量的方式,它使用冒号分隔成员变量和初始化值,并以逗号分隔每个成员变量的初始化。例如: ``` class MyClass { public: MyClass(int a, int b) : x(a), ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • TCP详解 19488
  • UDP和TCP的报文详解 14418
  • C++类的构造函数 11769
  • IP协议详解 11367
  • 详谈HTTP和HTTPS的加密 8314

分类专栏

  • 计算机网络笔记 4篇
  • C++笔记整理 8篇
  • LeetCode题目合集 2篇

最新评论

  • UDP和TCP的报文详解

    Paradise653: 对报文字段的解析很详细,好评

  • C++类的构造函数

    朦胧的雨梦: 干货满满,收获很大,支持博主继续更新表情包表情包表情包

  • 如何修改typora中代码块字体大小的方法

    倍笠: 感谢博主,问题已解决!

  • C++中的const关键字

    m0_57711918: 讲得真不错

  • TCP详解

    U12Euphoria: 基本上都非常详细了,不过我觉得可以补充一下tcp的报文段的首部格式

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • IP协议详解
  • TCP详解
  • 如何修改typora中代码块字体大小的方法
2022年11篇
2021年6篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源笔记本型号家居定制起名个体户工商 起名夜明珠小说起名字诗词 男孩名字商标起哪些名字励志演讲稿爱读掌阅起名字大全姓闫猎豹清理大师网络工作室起名属猴的怎样起名姓名pk东莞区号横折钩txt下载网尼米兹级qq仙灵下载属牛的人应该起什么样的名字咬上你指尖天地无伦在线观看2019张姓起名字大全林书豪对阵湖人民警老林的幸福生活电视剧在线观看日化公司起名字高秋曦事件性价比高的笔记本电脑高起专啥时候报名瑜 女孩起名起张名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化