前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++中类的数据成员初始化次序

c++中类的数据成员初始化次序

作者头像
六月丶
发布2022-12-26 17:26:20
8010
发布2022-12-26 17:26:20
举报
文章被收录于专栏:六月-游戏开发六月-游戏开发

分享一个之前学的知识点,感觉还挺重要的,就是当一个类中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢? 根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效,但是就地初始化和构造函数初始化列表的执行情况是怎样呢?写段代码测试一下

代码语言:javascript
复制
#include<iostream>
#include<cstdio>

using namespace std;

int n = 0;
class STU{
private:
    int id = ++n;       //就地初始化 
public:
    STU(){};         
    STU(int id):id(id){ //初始化列表 
    }
    int getId(){
        return id;
    }
    ~STU(){
    }
};

int main(){
    cout << n << endl;      
    STU s1{};   //调用无参构造
    cout << "n = " << n << ",id = " << s1.getId()<< endl;   
    STU s2{10}; 
    cout << "n = " << n << ",id = " << s2.getId()<< endl;

    return 0;
} 

运行结果为: 0 n = 1,id = 1 n = 1,id = 10 可以看出,当调用无参构造时,id执行了就地初始化,而当调有参构造函数时,id没有执行就地初始化,而是直接执行了构造函数初始化列表。 所以当一个数据成员同时拥有就地初始化和初始化列表时,它会忽略就地初始化而执行构造函数初始化列表。 如果到代码中的有参构造函数的函数体中加上 this->id = 20; ,运行结果会变为: 0 n = 1,id = 1 n = 1,id = 20 可以看到赋值把初始化列表给id初始化的值覆盖掉了,这里在情理之中。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019 年 09 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档