effective c++ 条款4 make sure that objects are initialized before they are used
1 c++ 类的数据成员的初始化发生在构造函数前
class InitialData
{
public:
int data1;
int data2; InitialData(int a, int b)
{
data1 = a; //this is assignment
data2 = b; //this is assignment
} /*
InitialData(int a, int b):data1(a),data2(b) //this is initial
{}
*/
}
2 不同cpp文件中的static变量初始化顺序不确定,千万不要互相引用
比如有个 FileSystem类
class FileSystem
{
public:
...
int getDiskNum() const;
}
extern FileSystem tfs;//in the hfile, used in the future for some other class
然后在一个叫global.cpp文件中申明了一个全局 FileSystem tfs;
然后有个Directory类用到tfs
#include "FileSystem.h" class Directory
{
public:
Directory()
{
int t=tfs.numDisks();
}
};
有个人需要用Directory类,于是他申明
Directory tmpDir;这时就出现问题,tmpDir初始化时需要用到tfs,单编译器不能保证在编译tmpDir之前编译tfs,于是就会出现编译错误。
解决方案是采用singleton模式,利用函数得到全局变量
FileSystem& getFileSystem
{
static FileSystem tfs;
return tfs;
}
在Directory要调用tfs时用这个函数
#include "FileSystem.h" class Directory
{
public:
Directory()
{
int t=getFileSystem();
}
};
effective c++ 条款4 make sure that objects are initialized before they are used的更多相关文章
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- Effective C++ 条款08:别让异常逃离析构函数
1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...
- Effective C++ -----条款28:避免返回handles指向对象内部成分
避免返回handles(包括reference.指针.迭代器)指向对象内部.遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handle ...
- Effective C++ -----条款21:必须返回对象时,别妄想返回其reference
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- Effective C++ -----条款18:让接口容易被正确使用,不易被误用
好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限 ...
- Effective C++:条款27——条款
条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!
- Effective C++ 条款45
本节条款的题目是运用成员模板接受全部兼容类型 作者阐述自己的观点是通过智能指针的样例. 在学习本节条款之前我们要先明确关于隐式转化的问题 例如以下代码: #include<iostream> ...
随机推荐
- java多线程:ReentrantReadWriteLock读写锁使用
Lock比传统的线程模型synchronized更多的面向对象的方式.锁和生活似,应该是一个对象.两个线程运行的代码片段要实现同步相互排斥的效果.它们必须用同一个Lock对象. 读写锁:分为读锁和写锁 ...
- 经常使用Firefox插件大全
Web开发者经常使用的火狐插件 1)FireShot:是一个截图工具,来源于截图软件Screenshot Studio的开发商,是一个Firefox扩展或者说是Firefox版的Screenshot ...
- ADO.NET之1-数据库连接---ShinePans
ADO.NET技术主要包含Connection,Command,DataReader,DataAdapter,DateSet,DataTable等六种对象 1).Connection 对象的主要功能是 ...
- Git详解之六 Git工具(转)
Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控制所需的大多数日常命令和工作流程.你已经完成了跟踪和提交文件的基本任务,并且发挥了暂存区和轻量级的特性分支及合并的威力. 接下来你 ...
- Fashion Meets Finance聚会来袭-7月19日 北京
http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NjEzMjMyMQ%3D%3D&appmsgid=10000704&itemidx= ...
- premake 使用clang替换gcc
接着前文:premake在Ubuntu和GCC环境下创建简单的C++工程 由于clang支持gcc所有参数,所以使得在premake中替换gcc变得很简单.基本上就是通过传递参数或者设置环境变量的方式 ...
- IE浏览器审查密码的清除
上周去188工业区,总装厂的喷油部的电脑上被谁设置了IE的审查密码,后来通过电话沟通,运维岗给出了具体的解决方法: 进入注册表HKEY_LOCAL_MACHINE\Software\Microsoft ...
- Mac中如何写NTFS的移动硬盘
Mac中如何写NTFS的移动硬盘 按 照网上的说法,简单的就是购买Paragon NTFS或者Tuxera NTFS之类的收费软件,不想花钱的就用NTFS-3G.作为一个开发人员,既然能够自己解决,当 ...
- HDU3977(斐波那契数列模n的循环节长度)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...
- UC高级编程--实现myls程序
跟着达内视频,学习UC高级编程,完毕程序小练习. 主要练习的函数为: int lstat(const char *path, struct stat *buf); size_t strftime( ...