條款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.pswp.cn/news/375681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375681.shtml
英文地址,請注明出處:http://en.pswp.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

檢查這個函數對應的基類函數 看是否是虛函數看函數參數是否對應