찾다

 >  Q&A  >  본문

C++类内初始化与初始化列表

天蓬老师天蓬老师2802일 전928

모든 응답(2)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-17 13:00:14

    如@GAO 所说,C++11的类内初始化允许非static成员的初始化,可以用{}或=号。
    构造函数的初始化列表 与 类内成员初始化 没有谁好谁不好,谁来替代谁,两种方法可相互补充使用。类内初始化有一些好处:
    1、当你有多个构造函数时,如果使用初始化列表,每个构造函数都要写一遍,烦人不说,同时产生重复代码,修改易漏。如果把这些成员都用类内初始化,初始化列表就不用再列出它们了。
    2、类内初始化,成员之间的顺序是隐式的,会有些便利。如果使用初始化列表,它是有顺序之分的,顺序不对,编译器会警告。
    3、对于简单的类或结构,没有构造函数的,可以直接用类内初始化在成员声明的同时直接初始化,方便。

    对于一些类类型的成员初始化要小心,如果成员之间有依赖关系,这时使用初始化列表显式的指明这些成员的构造(初始化)顺序是比较稳妥的。

    如果成员已经使用了类内初始化,但在构造函数的初始化列表又列出来,编译器以后者优先,类内初始化会被忽略。如果某些成员使用不同构造函数时,会有不同的默认值,这种情况就要用初始化列表。同时,其它成员依然可以使用类内初始化。

    类内初始化绝对不是解决什么内置类型默认初始化时未定义问题。面向对象编程一个很重要的原则,程序员有责任要保证对象产生出来,它的每个成员都必须是初始化的,这是设计问题以及基本意识,无论是使用哪种方法初始化。

    회신하다
    0
  • PHPz

    PHPz2017-04-17 13:00:14

    好像C++11之后就支持类内初始化了,在之前类内初始化是不允许的

    class A{
        static const int a = 7; //C++98允许
        int b = 8; //C++11允许,而98不允许
    }

    我个人认为类内初始化将会随着C++11 成为主流。

    회신하다
    0
  • 취소회신하다