C++之尽可能延后定义式的出现时间(26)---《Effective C++》
来源:互联网 发布:如何看待网络暴力 编辑:程序博客网 时间:2024/05/17 13:41
条款26:尽可能延后定义式的出现时间
在看这个条款之前,我们先来看看如下代码:
std::string encryptPassword(const std::string& password){ using namespace std; string encrypted; if(pw.length()<miniLength){ throw logic_error("Password is too short"); } ... return encrypted;}
想象这种形式的代码可能有什么问题呀,哈哈,有很大问题呢?如果该函数执行到if语句时候抛出异常,你仍得付出encrypted的构造函数和析构函数,浪费资源,这时候我们可以考虑将其延后,直到确保需要它,代码如下:
std::string encryptPassword(const std::string& password){ using namespace std; if(password.length()<MinimumPasswordLength){ throw logic_error("Password is too short!"); } string encrypted; ...//必要的动作,但确保这些代码中不能抛出异常 return encrypted;}
我们知道,我们对一个对象赋值,可以有两种方法:1)通过默认构造函数构造出一个对象,然后调用赋值运算符对其进行赋值;2)直接在构造时指定初值。那么那种比较好呢?因为第二种在构造时候直接赋初值,效率很高,因此我们常常使用第二种,代码如下:
第一种:
std::string encryptPassword(const std::string& password){ ... std::string encrypted; encrypted=password;//先声明变量,然后赋值 encrypt(encrypted); return encrypted;}
第二种;
std::string encryptPassword(const std::string& password){ ... std::string encrypted(password);//调用copy构造函数,在定义时候直接赋初值 encrypt(encrypted); return encrypted;}
PS:如果在声明默认构造函数后,没有定义该类的copy assignmeng操作符号,只是顶一个copy constructor构造函数,那么“copy构造函数适用于第一次出现的变量,copy assignment运算符适用于第二次或者以上出现的变量”这条规则在这儿不适用,因为你没有定义copy assignment构造符,所以只能调用copy constructor了,代码如下:
#include <iostream>#include <string>using namespace std;class A{public: A(int xx) :x(xx){ } A(){ } void show(){ cout << x << endl; } A(const A&a){ cout << "a的构造函数。。。" << endl; this->x = a.x; } /*A& operator=(const A& a){ this->x = a.x; return *this; }*/private: int x;};int main(){ A a(10); A a1 = a; a1.show(); return 0;}
运行结果:
同时,除了上述两种情况外,还可能有循环的情况,这是后我们就需要考虑如下两种情况那种比较好一些:
1)外部定义+内部赋值
Widget w;for(int i=0;i<n;i++){ w=...; ...}
2)内部定义+内部赋值
for(int i=0;i<n;i++){ Widget w(...); ...}
这时候我们就需要考虑一下啦,如果Widget的构造+析构成本很大的话,尤其当n很大的时候,或者当代码效率高度敏感的部分,我们选用1)做法,否则选用2)做法,1)做法对w的作用域比2)做法的作用于范围更大一些。
总结:尽可能延后变量定义式出现的时间,这样可以增加程序的清晰度,并改善程序执行的效率。
阅读全文
0 0
- C++之尽可能延后定义式的出现时间(26)---《Effective C++》
- 《Effective C++》读书笔记之item26:尽可能延后变量定义式的出现时间
- C++(Qt)之尽可能延后定义式的出现时间
- 《Effective C++》学习笔记条款26 尽可能延后变量定义式的出现时间
- Effective C++:条款26:尽可能延后变量定义式的出现时间
- 读书笔记《Effective C++》条款26:尽可能延后变量定义式的出现时间
- effective c++尽可能延后变量定义式的出现时间
- 《Effect C++》学习------条款26:尽可能延后变量定义式的出现时间
- 【Effection C++】读书笔记 条款26:尽可能延后变量定义式的出现时间
- 尽量延后变量定义式的出现时间《Effective C++》
- Effective C++ Item 26 尽可能延后变量定义式的出现时间
- Effective C++条款26解读: 尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式出现的时间
- 条款26:尽可能延后变量定义式的出现时间
- 解决跨域问题
- 1001.Add More Zero
- String inequality
- Ubuntu mirror source modify
- 使用列表渲染wx-for改写新闻列表
- C++之尽可能延后定义式的出现时间(26)---《Effective C++》
- 图片水平垂直居中对齐
- STL中vector/map/set实现原理
- 【C】动态内存开辟(2)——动态内存开辟实例!!!
- Ajax技术--多级联动下拉列表($.ajax())
- Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(info)
- offer面试题-----链表反转
- shell趣味编程:case语句判断字符串内容
- hdu1048 The Hardest Problem Ever(C语言)