条款32: 尽可能地推迟变量的定义

// 此函数太早定义了变量"encrypted"
string encryptPassword(const string& password)
{string encrypted;//默认构造函数初始化if (password.length() < MINIMUM_PASSWORD_LENGTH) {throw logic_error("Password is too short");}进行必要的操作,将口令的加密版本  放进encrypted之中;return encrypted;
}

对象encrypted在函数中并非完全没用,但如果有异常抛出时,就是无用的。但是,即使encryptPassword抛出异常(见条款M15),程序也要承担encrypted构造和析构的开销。所以,最好将encrypted推迟到确实需要它时才定义:

// 这个函数推迟了encrypted的定义,
// 直到真正需要时才定义
string encryptPassword(const string& password)
{if (password.length() < MINIMUM_PASSWORD_LENGTH) {throw logic_error("Password is too short");}string encrypted;进行必要的操作,将口令的加密版本  放进encrypted之中;return encrypted;
}

这段代码还不是那么严谨,因为encrypted定义时没有带任何初始化参数。这将导致它的缺省构造函数被调用。大多数情况下,对一个对象首先做的一件事是给它一个什么值,这通常用赋值来实现。条款12说明了为什么"缺省构造一个对象然后对它赋值"(调用缺省构造函数初始化和拷贝赋值运算符赋值)比"用真正想要的值来初始化这个对象"(显式调用构造函数初始化)效率要低得多。这一论断在此一样适用。例如,假设encryptPassword中最难处理的部分在这个函数中进行:

void encrypt(string& s);      // s在此加密

于是encryptPassword可以象这样实现(当然,它不是最好的实现方式):

// 这个函数推迟了encrypted的定义,
// 直到需要时才定义,但还是很低效
string encryptPassword(const string& password)
{...                      // 同上,检查长度string encrypted;        // 缺省构造encryptedencrypted = password;    // 给encrypted赋值
  encrypt(encrypted);return encrypted;
}

更好的方法是用password来初始化encrypted,从而绕过了对缺省构造函数不必要的调用:

// 定义和初始化encrypted的最好方式
string encryptPassword(const string& password)
{...                             // 检查长度string encrypted(password);     // 通过拷贝构造函数定义并初始化
encrypt(encrypted);return encrypted;
}

 

你不仅要将变量的定义推迟到必须使用它的时候,还要尽量推迟到可以为它提供一个初始化参数为止。这样做,不仅可以避免对不必要的对象进行构造和析构,还可以避免无意义的对缺省构造函数的调用。而且,在对变量进行初始化的场合下,变量本身的用途不言自明,所以在这里定义变量有益于表明变量的含义。

 

转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3919345.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xilinx-arm-linux交叉编译链安装

1、下载交叉编译链 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin&#xff0c;直接搜这个&#xff0c;网上有资源。 2、安装依赖库 sudo apt-get install lib32ncurses5 lib32z1 3、修改shell sudo dpkg-reconfigure -plow dash&#xff0c;在出现的界面中选no 4、安装 ./xi…

第一章 1.6 HTML5 的新功能(二)

1.6.4 使用 Selectors API 简化选取操作 除了语义化元素外&#xff0c;HTML5 还引入了一种用于查找页面 DOM 元素的快捷方式。 1-3 列出表了在 HTML5 出现之前&#xff0c;用来在页面中查找特定元素的函数。 函数描述示例getElementById()根据指定的id特性值查找并返回元素<…

Mercurial hg web server的配置

在windows下安装tortoisehg-1.0.3-hg-1.5.3-x64.exe的版本控制工具后&#xff0c;克隆建立中心库后&#xff0c;启动web server&#xff0c;其他分库可以连接中心库进行pull但无法push。 这个可能是tortoisehg工具的问题&#xff0c;需要手工在.hg/hgrc文件中加入以下内容才可以…

dorado开发模式下实现动态查询

使用dorado开发模式,我们可以实现以下开发技巧 开发技巧1.实现动态查询功能: 1. 查询按钮的onClick事件中写入: datasetEmployee.parameters().setValue(“employee_id”, editor_employee_id.value); datasetEmployee.parameters().setValue(“employee_name”, editor_employ…

港澳通行证办理手续

港澳通行证办理手续&#xff1a; 一、办理前准备 1、 户口本 原件复印件。 2、 身份证 (一张纸&#xff0c;正反面)原件复印件。 3、 两张两寸白底免冠照片。 二、办理地点 1、户口所在地公安局 出入境管理处&#xff08;科&#xff09;。 三、办理时 1、排队、填写 【往来港澳…

undefined reference to `cv::VideoCapture::VideoCapture()'

缺少库&#xff0c;添加相应库就行&#xff0c;我的Qt Create中做的是&#xff1a; LIBS -L/home/mima111/opencv345/lib -lopencv_imgcodecs -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio 实际上添加-lopencv_videoio就行

HDU2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 39259 Accepted Submission(s): 16261 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

博客3万访问量了……

博客有3万访问量了呢。自从第一次用了赠送的1500的流量券&#xff0c;粉丝了从零突破了&#xff0c;到现在有150个粉丝了。 之前预想的写博客的初衷&#xff0c;也是记录自己的学习过程&#xff0c;毕竟好记忆不如烂笔头&#xff0c;记录下来就是长长久久的&#xff0c;随时可以…

Mint17 一些安装备忘

1&#xff0c;中文输入法&#xff1a; sudo apt-add-repository ppa:fcitx-team/dailybuild-fcitx-master sudo apt-get update sudo apt-get upgrade sudo apt-get remove ^ibus* sudo apt-get remove ^fcitx* sudo apt-get install fcitx fcitx-bin fcitx-config-common fcit…

error: ‘CV_BGR2RGB’ was not declared in this scope

缺少库&#xff0c;添加相应库就行&#xff0c;ubuntu中Qt Create设置如下 LIBS -L/home/mima111/opencv345/lib -lopencv_imgcodecs -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio 实际只要添加-lopencv_imgproc就行&#xff0c;CV_BGR2RGB变量存储在该…

Struts学习之手动验证

* 首先要从页面中获取对应的标签name属性的值&#xff0c;在动作类action中声明同名的属性&#xff0c;提供get和set方法 * 要继承ActionSupport类或者实现Validateable接口 * 重写Validateable接口的validate()方法 * 前提是&#xff1a;要保证setUsername()、va…

《启示录-打造用户喜爱的产品》读书小结

2014年大学毕业和研究生入学之间的暑假&#xff0c;我读完了这本书。该书主要内容为介绍产品经理的一些工作经验。分三方面内容系统介绍&#xff1a;人员、流程和产品。第一遍读后&#xff0c;了解了一些产品经理的工作内容&#xff0c;也学习了很多优秀产品经理的理念。转载于…

循环多少次?

循环多少次&#xff1f; Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 17 Accepted Submission(s) : 12 Problem Description我们知道&#xff0c;在编程中&#xff0c;我们时常需要考虑到时间复杂度&#xff0…

关于数据库表的“记录”与“字段”

何谓表的记录&#xff1a; 就是数据库中的一张表中的随便任意一行称之为记录 何谓表的字段&#xff1a; 就是数据库中的一张表中的随便任意一列称之为字段转载于:https://www.cnblogs.com/cyh2009/p/4706021.html

error: use of deleted function

本文案例仅供参考 出错的代码如下&#xff1a; TEST(Test, test1) {TestImpl impl TestImpl(para1, para2);ASSERT_EQ("jkj", impl.func("22", "33", "44")); }实际应该这样&#xff1a; TEST(Test, test1) {TestImpl impl(para1, …

WPF PasswordBox不支持绑定解决方法

PasswordBox的Password属性因为安全原因不支持直接绑定&#xff0c;可以使用依赖属性实现。直接插入代码 public class PasswordBoxHelper{public static readonly DependencyProperty PasswordProperty DependencyProperty.RegisterAttached("Password",typeof(stri…

error: expected unqualified-id before 'public'

Error Coding class A{ }&#xff1b;class B public : A { };Correct Coding class A{ };class B : public A{ };

C# 方法返回值的个数

方法返回值类型总的来说分为值类型&#xff0c;引用类型,Void 有些方法显示的标出返回值 public int Add(int a,int b) {return ab; } 有些方法隐式的返回返回值&#xff0c;我们可以将上面的方法改改&#xff1a; public void Add(int a,int b,out int sum) {sumab; } 怎么样&…

【Java】Java里String 的equals和==

Java里面有对象和对象的引用的概念&#xff0c;在String方面&#xff0c;比较的是引用&#xff0c;equals比较的是对象的具体值。 String s1 new String("abc");String s2 new String("abc");System.out.println(s1 s2);System.out.println(s1.equals(s…

marked override, but does not override

检查这个函数对应的基类函数 看是否是虚函数看函数参数是否对应