类成员的初始化可采用如下两种形式完成:在构造体中赋值完成和用初始化类完成员列表完成,我们先看一下它们各自的形式。
class CStudent { public: CStudent(string name,int age,int id); ~CStudent(); private: string m_name; int m_age; int m_id; };
在构造函数中赋值完成:
CStudent::CStudent(string name, int age, int id) { m_name = name; m_age = age; m_id = id; }
用初始化类成员列表来完成:
CStudent::CStudent(string name, int age, int id) : m_name(name) , m_age(age) , m_id(id) {}两者的区别:
1.第一种实现的“=”操作本质是赋值,第二种才是真正的初始化,一般两种方法都适用,但有些情况只能用第二种
const常量成员变量只能用初始化列表来完成初始化,而不能在构造函数内赋值。
2.有时候考虑到效率问题,也会选择初始化列表。
假设类B中含有一个A类型的成员变量
class A{}; class B { public: B(); ~B(); private: A m_A; }; B::B() { m_A = A(); } B::~B() { }
在这个过程中,会产生临时对象,临时对象的析构会造成无谓的效率损耗。
对于初始化列表,有一个问题必须说明,那就是初始化顺序,初始化列表中出现的顺序并不是真正的初始化顺序,取决于成员变量在类中的声明顺序。
注意:
只有保证成员变量的声明顺序与初始化列表顺序一致才能真正保证其效率。