C++类成员的初始化顺序
C++中变量的初始化顺序应该是:
- 1 基类的静态变量或全局变量
- 2 派生类的静态变量或全局变量
- 3 基类的成员变量
- 4 派生类的成员变量
注意,对于一个类中的变量,初始化的顺序并不是按照初始化成员列表的顺序进行初始化,而是根据类中变量定义的顺序来初始化的。比如:
下面一个例子输出应该是多少?
class A
{
private:
int n1;
int n2;
public:
A():n2(0),n1(n2+2){}
void Print(){
cout << "n1:" << n1 << ", n2: " << n2 <<endl;
}
};
int main()
{
A a;
a.Print();
return 1;
}
看起来似乎是n1 = 2,n2=0; 其实不然。实际结果是:n1=-858993458,n2=0.
如果我把A类中构造函数改成:
A()
{
n2 = 0;
n1 = n2 +2;
}
那么此时输出结果为: n1 = 2,n2 = 0.
分析: 为什么上边的不是我们想要的结果呢?是因为在构造函数用初始化列表进行初始化的时候,初始化的顺序与初始化列表的顺序是无关的。只是与定义成员变量的顺序有关。所以在第一个程序中,首先找到n1(n1先定义的)进行初始化,n1初始化需要用到n2的值,但是n2只是声明了并没有初始化,所以n1就被初始化成了一个随机值。
总结:
成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。
C++类成员的初始化顺序相关推荐
- c++构造函数以及类中变量初始化顺序
c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...
- 构造方法、类的初始化块以及类字段的初始化顺序
构造方法 首先,以下代码为何无法通过编译?哪儿出错了? public class Test {public static void main(String[] args) {Foo obj1 = ne ...
- c++模板类静态成员变量_一文讲透父子类中静态变量,成员变量初始化顺序原理...
推荐: 从面试到入职到离职,我在B站工作的30天时光 爱了爱了,Alibaba顶级MySQL调优手册到手,加薪妥了 爱了爱了,Spring Cloud Alibaba内部微服务架构笔记真的太牛了 本文 ...
- java中具有继承关系的类及其对象初始化顺序
先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...
- C++成员变量初始化顺序问题
由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy print? class A { private: int n1; int n2; publi ...
- C++类成员的初始化
分类: c/c++进行时 2012-04-11 10:02 14697人阅读 评论(7) 收藏 举报 c++stringinitializationclass编译器面试 1.关于构造函数 1)用构造函 ...
- java 继承对象 初始化_java中具有继承关系的类及其对象初始化顺序
先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...
- Java类中的初始化顺序
根据<Thinking in Java>相关章节及自己的理解举例来说明类初始化顺序. public class InitialOrder {private static String st ...
- java类成员变量初始化_探讨Java类中成员变量的初始化方式
在 Java 里定义一个类的时候,很多时候我们需要提供成员变量,成员变量专业叫法是 Memeber Variable 或者干脆的叫作 Field. 根据是否使用 static 关键字修饰,可以将 Fi ...
最新文章
- 跨域?拒绝说概念(内含demo)
- 年轻人裸辞,需不需要“冷静期”?
- 第十七届全国大学生智能车竞赛开始啦
- vector 指针 的指针
- Linux进程地址空间学习总结
- elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理
- php读取pdf文件乱码_PHP 读取PDF文件内容之PdfParser
- 第四次博客:循环单链表解决约瑟夫环问题
- java和C和C++关系
- centos7yum安装VirtualBox
- java编程输入学生成绩 判断最高分_从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分_学小易找答案...
- Excel 2016 对数据做线性回归分析步骤
- secoclient免积分下载
- 【MySQL】为什么要学习MySQL数据库呢?
- 全新AIY Edge TPU开发板惊艳亮相,今秋发布!
- 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
- qiankun前端微服务框架-同一服务器同一端口
- webstorm配置环境变量_Webstorm 配置与使用 Less
- 超声波的四个特性_超声波的几个特性
- sau交流学习社区第三方登陆github--oauth来实现用户登录
热门文章
- python在财务中的应用-【手把手教你】Python金融财务分析
- python练手经典100例-【Python精华】100个Python练手小程序
- h5 语音识别_h5 在线语音识别接口_html5 语音识别 - 云+社区 - 腾讯云
- css 文字超出隐藏显示省略号
- vue-props入门
- 步骤条与Tab栏的联动 ~ 不要错过
- 【计算机网络笔记】编码与调制
- 【java笔记】Properties类
- python 提示框如何顶层显示_python tkinter之顶层菜单、弹出菜单实例
- r语言和python的区别_c语言和python的区别