Effective C++读书笔记(四)确认对象在使用之前被初始化
2013-10-19 01:01
417 查看
前言c++对于变量声明具有很强的变化性,变量初始化的值因编译器而异。比如,int x;在某些情况下x被初始化为0,而有的时候是-858993460(min_int)。对于某些编译器会检查没有被初始化的变量(vc6.0,vs2008)并给出警告,但是做为合格coder应该消除警告。
构造函数初始化效率高于赋值
上面代码是用赋值给类成员初始化,声明ABEntry abc=new ABEntry时发生错误。
把ABEntry的构造改为上述代码,使用成员初始化列表初始化。需要注意的是成员初始化列表要和类成员声明顺序一致,具体参考http://blog.csdn.net/zxy2011qp/article/details/12842745
构造次序
上面四个文件编写过程按上面顺序,最后编译A.cpp出现错误(其他都编译通过),主要是类Directory没有声明,这是因为类Directory依赖于外部变量tfs,而tfs和类Directory的声明顺序是不可知道的(谁先谁后不能确定),所以发生了错误。
我们需要改变的是把tfs声明为静态变量就能解决这个问题,如下
构造函数初始化效率高于赋值
#include<iostream> #include<list> 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>& phones){ theName=name; theAddress=address; thePhones=phones; numTimesConsulted=0;} int main() { //ABEntry abc=new ABEntry; //std::cout<<sizeof(abc)<<std::endl; return 0; }
上面代码是用赋值给类成员初始化,声明ABEntry abc=new ABEntry时发生错误。
ABEntry::ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones) :theName(name), theAddress(address), thePhones(phones), numTimesConsulted(0) {}
把ABEntry的构造改为上述代码,使用成员初始化列表初始化。需要注意的是成员初始化列表要和类成员声明顺序一致,具体参考http://blog.csdn.net/zxy2011qp/article/details/12842745
构造次序
//head.h #include<stddef.h> #include<iostream> class FileSystem { public: std::size_t numDisk() const; };
//C.cpp #include "head.h" FileSystem tfs;
//B.cpp #include"head.h" extern FileSystem tfs; class Directory{ public: Directory(int params); }; Directory::Directory(int params) { std::size_t disks=tfs.numDisk(); }
//A.cpp #include<iostream> #include"head.h" using namespace std; int main() { Directory s1(1); return 0; }
上面四个文件编写过程按上面顺序,最后编译A.cpp出现错误(其他都编译通过),主要是类Directory没有声明,这是因为类Directory依赖于外部变量tfs,而tfs和类Directory的声明顺序是不可知道的(谁先谁后不能确定),所以发生了错误。
我们需要改变的是把tfs声明为静态变量就能解决这个问题,如下
//head.h #include<stddef.h> #include<iostream> class FileSystem { public: std::size_t numDisk() const{return 0;} }; class Directory{ public: Directory(int params); };
//B.cpp #include"head.h" FileSystem& tfs(){ static FileSystem fs; return fs; } Directory::Directory(int params) { std::size_t disks=tfs().numDisk(); }
//A.cpp #include<iostream> #include"head.h" using namespace std; int main() { Directory s1(0); return 0; }
相关文章推荐
- effective C++ 读后感(四) 确定对象被使用之前已被初始化
- BeanPostProcessor 的使用,实现在对象初始化之前或者之后对对象进行操作
- 对象使用之前初始化
- 【寒江雪】确保在对象被使用之前初始化
- 《Effective C++》读书笔记04:确保对象在使用之前被初始化
- 对象使用之前初始化
- effective C++ 04_确定对象被使用前已被初始化 读书笔记
- UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。
- java中类/对象的初始化顺序以及静态代码块的使用
- 条款04:确定对象被使用前已先被初始化
- 合理使用 inline来优化程序 尽可能减少临时对象 尽可能使用初始化列表
- Effective C++ 之 Item 4:确定对象被使用前已先被初始化
- Map生成器 map适配器现在可以使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象
- Effective C++学习4 条款04:确定对象在被使用前以被初始化
- 条款04:确定对象被使用前已先被初始化(Make sure that objects are initialized before they're used.)
- idea下使用autowire注解注入对象,结果初始化不到类
- 获取Spring中bean对象或在Spring初始化完成之后使用Spring中bean对象
- 使用数组来初始化 vector 对象
- 确定对象被使用前巳先被初始化
- 在看官方的例子时候由一个grid实例,在每一行之前有个加号,展开可以显示内容,在实际应用中还是非常有用的,照搬例子的代码,发现老是提示对象不存在,查阅资料后发现是没有加载插件,这里和大家分享下Ext.grid.RowExpander插件的使用,