effective c++尽可能延后变量定义式的出现时间
2015-11-09 23:08
399 查看
原书用的是一个c++标准库的函数,这里为了简练,就随便写了一个函数,但意思相近
可以改成这样
这样就完美了
再来看下面的问题
但是我奇思妙想,如果这样做,问题不就都解决了吗?不知道会不会有什么问题,但是又保证了效率,又不会因为对象定义影响后面的代码
void doSth(int i) { string s; //过早的定义了这个变量 //如果i == 0则导致白白的声明了这个变量 if(i == 0)throw logic_error("i == 0"); s = "string"; }
可以改成这样
void doSth(int i) { if(i == 0)throw logic_error("i == 0"); string s; //延后了s的定义式,直到需要它才定义 //但是还有一个小问题,s对象是先初始化,再赋值的 //条款四曾经说过通过default构造函数构造出来一个对象然后再对它赋值 //比在构造时指定初值效率差 s = "string"; }
这样就完美了
void doSth(int i) { if(i == 0)throw logic_error("i == 0"); string s("string"); //不仅仅要延后变量定义,直到非得使用该变量的前一刻为止 //甚至应该延后这份定义直到能够给它初值为止 }
再来看下面的问题
Widget w; for(int i = 0;i < n;i++) { w = ...; //1个构造函数 + 1个析构函数 + n个赋值函数 } /////////////////////////////////////////////////// //-----------------------------------------------/// ////////////////////////////////////////////////// for(int i = 0;i < n;i++) { Widget w(...); //n个构造函数 + n个析构函数 } //如果一个赋值成本低于一组构造+析构函数成本,上面做法比较高效 //但是上面做法造成名称w的作用域比下面的大,对程序的可理解性和易维护性造成冲突 //所以除非(1)赋值成本<构造+析构(2)代码属于效率高度敏感,否则最好用下面的做法
但是我奇思妙想,如果这样做,问题不就都解决了吗?不知道会不会有什么问题,但是又保证了效率,又不会因为对象定义影响后面的代码
class Widget { public: Widget() { cout << "construct" << endl; } Widget& operator =(const Widget& rsh){ cout << "operator=" << endl; p = rsh.getp(); return *this; } ~Widget() { cout << "destory" << endl; } int getp()const{return p;} private: int p; }; int main() { int n = 10; cout << "begin " << endl; { Widget w; for(int i = 0;i < n;i++) { w = w; //1个构造函数 + 1个析构函数 + n个赋值函数 } } cout << "end" << endl; }
相关文章推荐
- SQL Server中查看对象定义的SQL语句
- javascript 对象定义方法 简单易学
- 《Effective C++》学习笔记——条款26
- swift——对象定义
- asm实例中的视图信息与db实例中的视图信息不一致
- [C++渐进]引用与指针
- C/Cplusplus
- 什么是bind函数,为什么要使用bind函数
- 全错位排列问题
- lambda表达式的实质——什么是lambda表达式,为什么要使用lambda表达式
- 回调函数的实质——什么是回调函数,为什么要使用回调函数
- C语言编写年月日格式时间转换为格林威治时间
- C++ 中通过函数名字的字符串调用函数
- C++ 中通过函数名字的字符串调用函数
- c++多态性原理及应用 & c++以及cuda 计时技术小结
- 如何学好C++语言
- 在VC++中创建的项目中添加一个资源文件
- Merge Intervals(LeetCode)
- C++ Lamdba表达式
- C++11新特性之 rvalue Reference(右值引用)