c++中类的数据成员初始化次序
2023-02-18 16:42:45 时间
分享一个之前学的知识点,感觉还挺重要的,就是当一个类中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢? 根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效,但是就地初始化和构造函数初始化列表的执行情况是怎样呢?写段代码测试一下
#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初始化的值覆盖掉了,这里在情理之中。
相关文章
- linux应用程序开发入门
- linux设备驱动编写入门
- linux网络配置
- linux安装配置交叉编译器arm-linux-gnueabi-gcc
- Linux 安装配置 tftp 服务器
- linux 安装配置NFS服务器
- MongoDB经典故障系列六:CPU利用率太高怎么办?
- 选择困难症必看!云服务器如何选择操作系统,Windows和Linux哪个更好?
- KubeFlow-Pipeline及Argo实现原理速析
- C++ 中的复数
- Linux中那些没用但好玩的命令
- Go语言编程设计学习Day1:helloworld 变量 常量
- C++ Primer Plus习题及答案-第十五章
- 使用Go开源的一款性能监控软件
- 你应该知道的17个Golang包
- SSH Google Authenticator
- Oneinstack Nginx 反代 Google
- 嵌入式:ARM指令集分类及编码
- Linux系统中JAVA创建文件后权限不足的问题,无法设置权限的问题
- git 强制回退到指定版本