最佳处理方法就是:永远在使用对象之前先将它初始化
1.对于内置类型,你必须手工完成此事。
int x=0;
const char* text="a C-style string";
2.至于内置类型以外的任何其他东西,初始化责任都落在构造函数身上。
但是别混淆了赋值和初始化
class PhoneNumber{....};
class ABEntry
{
public:
ABEntry(const std::string & name, const std::string &address, const std::list<PhoneNumber>& phones);
private:
std::string theName;
std::string theAddress;
std::list<PhoneNumber> thePhones;
int numTimesConsulted;
};
ABEntry::ABEntry(const std::string &name,const std::string &address,const std::list<PhoneNumber>& pheones)
{
theName=name;
theAddress=address;
thePhones=phones;
numTimesConsulted=0;
}
这些都是赋值,并不是初始化。C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。
所以一个比较佳的写法是,使用成员初值列化列表替代赋值动作。
ABEntry::ABEntry(const std::string &name,const std:: string &address,const std::list <PhoneNumber>&phoens)
:theName(name),
theAddress(address),
thePhone(phones),
numTimeConsulted(0)
{}
这两个构造函数的最终结果相同,但是初始化列表效率更高,上一个构造函数,先调用默认构造函数对成员设初值,然后再对它们赋予新值,那默认构造函数做的一切都浪费了。初始化列表可以避免这个问题。
有些情况下即使面对的成员变量属于内置类型,如果成员变量是const或referencesa它们就一定需要初始化值,不能被赋值。
C++有着十分固定的“成员初始化次序”。次序总是相同:父类更早于其子类的初始化,而每个类的成员变量总是以其声明次序被初始化。即使它们再成员初始化列表中以不同的次序出现(合法)也不会有任何影响。为避免你和你的阅读者迷惑,最好总是以其声明的次序为次序。