网站大量收购独家精品文档,联系QQ:2885784924

《Effective -C++》条款04确定对象被使用前以先被初始化.docx

《Effective -C++》条款04确定对象被使用前以先被初始化.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《Effective-C》条款04确定对象被使用前以先被初始化

《Effective C++》------条款04 确定对象被使用前已先被初始化---------------make sure that objects are initialized before they used.-------初始化int x = 0;int y;如果不同的编译遇到y时有的会初始化(为0),有时候不会。读取不明确的值会导致不明确的行为,因为读取y值可能为任何值,最终导致不可预知的程序行为,最后也很能调试定位到。类成员的初始化C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。在构造函数内,都不是初始化,而是赋值。初始化发生的时间更早,发生于这些成员的default构造函数被自动调用之时(比进入函数本体之前更早)。初始化列表class PhoneNumber{};class ABEntry{public:ABEntry(const std::string name, const std::string address, std::listPhoneNumber phones);private:std::string theName;std::string theAddress;std::listPhoneNumber thePhones;int numTimesConsulted;};ABEntry::ABEntry(const std::string name, const std::string address, std::listPhoneNumber phones){theName = name;//这些都是赋值而不是初始化 会先调用拷贝构造然后在赋新值theAddress = address;thePhones = phones;numTimesConsulted = 0;}改写成ABEntry::ABEntry(const std::string name, const std::string address, std::listPhoneNumber phones):theName(name),//这才是真正的初始化 会带着值直接拷贝构造theAddress(address),thePhones(phones),numTimesConsulted(0){}该写后虽然最终效果都一样,但后者效率高。成员初始化顺序C++有着十分固定的“成员初始化次序”。先构造父类、再构造子类;成员变量以其声明顺序进行初始化;Static对象Static对象的生命周期从被构造出来,到程序结束为止。C++对不同的编译单元内的对象的初始化次序并无明确定义问题:假设有一个FileSystem class,它让互联网上的文件看起来像本机(local)。class FileSystem {public:}extern FileSystem tfs;如果在其它文件中调用tfs可能还未初始化,这导致程序崩溃。解决办法:单例模式 写到函数里FileSystem tfs(){static FileSystem fs;return fs;}这样使用对象的时候用函数调用,避免了使用前未初始化的现象。问题:如果你有一个系统,其中对象A必须在对象B之前先初始化,但A的初始化能否成功却又受制于b是否已初始化。这时候就有麻烦了?避免这种问题的解决办法:第一:手工初始化内置对象;第二:使用初始化成员列表;第三:定义好初始化顺序;牢记:为内置型对象进行手工初始化,因为c++不保证初始化它们。构造函数最好使用初始化成员列表,而不要在构造函数本体内使用赋值操作,初始化列表顺序应该和它们在类中的声明次序相同。为避免“跨编译单元的初始化次序”问题,请把对象写成static 封装成函数的方法去获取对象。

您可能关注的文档

文档评论(0)

jiupshaieuk12 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档