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++类成员的初始化顺序相关推荐

  1. c++构造函数以及类中变量初始化顺序

    c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...

  2. 构造方法、类的初始化块以及类字段的初始化顺序

    构造方法 首先,以下代码为何无法通过编译?哪儿出错了? public class Test {public static void main(String[] args) {Foo obj1 = ne ...

  3. c++模板类静态成员变量_一文讲透父子类中静态变量,成员变量初始化顺序原理...

    推荐: 从面试到入职到离职,我在B站工作的30天时光 爱了爱了,Alibaba顶级MySQL调优手册到手,加薪妥了 爱了爱了,Spring Cloud Alibaba内部微服务架构笔记真的太牛了 本文 ...

  4. java中具有继承关系的类及其对象初始化顺序

    先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...

  5. C++成员变量初始化顺序问题

    由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy  print? class A { private: int n1; int n2; publi ...

  6. C++类成员的初始化

    分类: c/c++进行时 2012-04-11 10:02 14697人阅读 评论(7) 收藏 举报 c++stringinitializationclass编译器面试 1.关于构造函数 1)用构造函 ...

  7. java 继承对象 初始化_java中具有继承关系的类及其对象初始化顺序

    先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...

  8. Java类中的初始化顺序

    根据<Thinking in Java>相关章节及自己的理解举例来说明类初始化顺序. public class InitialOrder {private static String st ...

  9. java类成员变量初始化_探讨Java类中成员变量的初始化方式

    在 Java 里定义一个类的时候,很多时候我们需要提供成员变量,成员变量专业叫法是 Memeber Variable 或者干脆的叫作 Field. 根据是否使用 static 关键字修饰,可以将 Fi ...

最新文章

  1. 跨域?拒绝说概念(内含demo)
  2. 年轻人裸辞,需不需要“冷静期”?
  3. 第十七届全国大学生智能车竞赛开始啦
  4. vector 指针 的指针
  5. Linux进程地址空间学习总结
  6. elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理
  7. php读取pdf文件乱码_PHP 读取PDF文件内容之PdfParser
  8. 第四次博客:循环单链表解决约瑟夫环问题
  9. java和C和C++关系
  10. centos7yum安装VirtualBox
  11. java编程输入学生成绩 判断最高分_从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分_学小易找答案...
  12. Excel 2016 对数据做线性回归分析步骤
  13. secoclient免积分下载
  14. 【MySQL】为什么要学习MySQL数据库呢?
  15. 全新AIY Edge TPU开发板惊艳亮相,今秋发布!
  16. 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
  17. qiankun前端微服务框架-同一服务器同一端口
  18. webstorm配置环境变量_Webstorm 配置与使用 Less
  19. 超声波的四个特性_超声波的几个特性
  20. sau交流学习社区第三方登陆github--oauth来实现用户登录

热门文章

  1. python在财务中的应用-【手把手教你】Python金融财务分析
  2. python练手经典100例-【Python精华】100个Python练手小程序
  3. h5 语音识别_h5 在线语音识别接口_html5 语音识别 - 云+社区 - 腾讯云
  4. css 文字超出隐藏显示省略号
  5. vue-props入门
  6. 步骤条与Tab栏的联动 ~ 不要错过
  7. 【计算机网络笔记】编码与调制
  8. 【java笔记】Properties类
  9. python 提示框如何顶层显示_python tkinter之顶层菜单、弹出菜单实例
  10. r语言和python的区别_c语言和python的区别