• <acronym id="qmqcg"><cite id="qmqcg"></cite></acronym>
    <td id="qmqcg"><em id="qmqcg"></em></td>
    • 首頁 > 生活 >

      天天速訊:C++ 特殊用途語言特性

      默認實參

      某些函數包含一些實參,在函數的很多次調用中他們都被賦予相同的一個值,此時我們把這個反復出現的值稱為函數的默認實參。調用含有默認實參的函數時,我們可以包含該實參,也可以省略該實參。


      (資料圖片僅供參考)

      例如我們用string對象表示窗口內容,一般我們希望該窗口的高、寬和背景字符都是用默認值,但是同時我們也允許用戶為這幾個參數自由指定與默認值不同的數值。我們把他定義成以下形式:

      我們為每一個參數都提供了默認實參,默認實參作為形參的初始值出現在形參列表中,我們可以為一個或多個形參定義默認值,一旦某個形參被賦予了默認值,他后面的所有形參都必須有默認值。

      使用默認實參調用函數

      如果我們想使用默認實參,只要在調用函數的時候省略該實參就行了。

      函數調用時實參按其位置解析,默認實參負責填補函數調用缺少的尾部實參

      第二種傳遞的雖然是個?字符,但是會自動轉換為sz的無符號整數,也就是ascii碼的值。

      當設計含有默認實參的函數時,一般將不常用的形參寫在前面,而將常用的寫在后面。

      默認實參聲明

      在給定作用域中一個形參只能被賦予一次默認形參,也就是函數后續的聲明只能為之前那些沒有默認值的形參添加默認實參,而且該形參右側的所有形參都必須又默認值。

      內聯函數和constexpr函數

      調用函數一般比求等價表達式的值要慢一些。在大多數機器上,一次函數調用其實包含這一系列工作,調用前要先保存寄存器,并在返回時恢復;可能需要拷貝實參,程序轉向一個新的位置繼續執行。

      內聯函數可避免函數調用的開銷

      將函數指定為內聯函數,通常是將他在每個調用點上“內聯的”展開。如果我們把之前的shorterString函數定義成內聯函數

      將在編譯過程中展開成類似

      的形式,這樣就消除了shorterString函數運行時的開銷。

      在shorterString函數的返回類型前加上關鍵字inline,這樣就可以將它聲明為內聯函數了。

      一般來說,內聯機制用于優化規模小、流程直接、頻繁調用的函數。很多編譯器都不支持內聯遞歸函數,而且一個75行的函數也不太可能在調用點內斂地展開。

      constexpr函數

      constexpr函數是指能用于常量表達式的函數。定義constexpr函數的方法和其他函數類似,不過需要注意,函數的返回類型及所有形參的類型都得是字面值類型,而且函數中必須有且只有一條return語句。

      執行該初始化任務時,編譯器把對constexpr函數的調用替換成其結果值,為了能在編譯過程中隨時展開,constexpr函數被隱式的指定為內聯函數。

      constexpr函數體內也可以包含其他語句,只要這些語句在運行時不執行任何操作就行,

      如果我們用一個非常量表達式調用scale函數,則返回值是一個非常量表達式。

      constexpr函數不一定返回常量表達式。

      由于內聯函數和constexpr函數可以在程序中多次定義,編譯器要想展開函數僅有函數聲明是不夠的,還要函數的定義。不過對于某個給定的內聯函數或者constexpr函數來說,他的多個定義必須完全一致,所以一般將內聯函數和constexpr函數定義在頭文件中。

      調試幫助

      有時我們會用到一種類似于頭文件保護的技術,以便有選擇地執行調試代碼。基本思想是,程序可以包含一些用于調試的代碼,但是這些代碼只在開發程序時使用,當應用程序編寫完成時,要先屏蔽調試代碼,這種方法用到兩項預處理功能,assert和NDEBUG。

      assert預處理宏

      assert是一種預處理宏,所謂預處理宏其實是一個預處理變量,他的行為有點類似于內聯函數,assert宏使用一個表達式作為他的條件,

      首先對expr求值,如果表達式為假,assert輸出信息并終止程序的執行,如果表達式為真,assert什么也不做。

      assert宏定義在cassert頭文件中。

      預處理名字由預處理器而不是編譯器管理,因此我們可以直接使用預處理名字而無需提供using聲明。我們應該直接使用assert而不是std::assert,也不需要using。

      和預處理變量一樣,宏名字在程序內必須唯一,含有assert頭文件的程序不能再定義名為assert的變量、函數或者其他實體。所以無論如何我們應該避免使用assert作為名字。

      assert宏常用于檢查“不能發生的條件”。例如,一個對輸入文本進行操作的程序可能要求所有給定單詞的長度都大于某個閾值,此時我們可以使用

      NDEBUG預處理變量

      assert的行為依賴于一個名為NDEBUG的預處理變量的狀態,如果定義了NDEBUG則assert什么也不做,默認狀態下沒有定義NDEBUG,此時assert將執行運行時檢查。

      我們可以使用#define語句定義NDEBUG,從而關閉調試狀態。所以,assert應該僅用于驗證那些確實不可能發生的事情,我們可以把assert當成調試程序的一種輔助手段,但是不能用它替代真正的運行時邏輯狀態,也不能替代程序本身應該包含的錯誤檢查。

      除了用于assert外,NDEBUG也可以編寫自己的條件調試代碼。如果NDEBUG未定義,將執行#ifndef和#endif之間的代碼,如果定義了NDEBUG,這些代碼被忽略

      我們使用變量__func__輸出當前調試的函數的名字,編譯器為每個函數都定義了__func__,他是const char的一個靜態數組,用于存放函數的名字。

      還有四個對于程序調試很有用的名字

      如果我們給程序提供了一個長度小于threshold的string對象,將得到下面的錯誤消息。

      關鍵詞:

      責任編輯:Rex_05

      推薦閱讀

      搶抓機遇發力先進制造業

      · 2023-04-05 11:32:13

      海南全島封關意義重大

      · 2023-04-05 11:53:17

      打官司越來越簡單

      · 2023-04-05 11:06:11

      天天資訊:雨潤春色

      · 2023-04-05 10:38:53

      關于我們 聯系我們 商務合作 誠聘英才 網站地圖

      Copyright @ 2008-2020 www.wnchengjie.com Corporation,All Rights Reserved

      熱訊新聞網 版權所有 備案號:豫ICP備20005723號-6
      文章投訴郵箱:2 9 5 9 1 1 5 7 8@qq.com 違法信息舉報郵箱:jubao@123777.net.cn

      營業執照公示信息

      亚洲线精品久久一区二区三区,成人看片在线观看,草草视频手机在线观看视频,亚洲六月丁香色婷婷综合久久
    • <acronym id="qmqcg"><cite id="qmqcg"></cite></acronym>
      <td id="qmqcg"><em id="qmqcg"></em></td>
      • 主站蜘蛛池模板: 波多野结衣视频在线免费观看| 538在线视频观看| h成人在线观看| 精品亚洲A∨无码一区二区三区 | 国产精品视频白浆免费视频| 免费在线黄色网| 久久天堂AV综合合色蜜桃网 | 久夜色精品国产一区二区三区| 亚洲成人自拍网| 最好看的免费观看视频| 国产日韩精品一区二区三区| 九九视频精品在线| 18av黄动漫网站在线观看| 美女网站免费福利视频| 欧美1区2区3区| 国产欧美曰韩一区二区三区| 亚洲av丰满熟妇在线播放| 97在线公开视频| 日本成人在线免费观看| 国产精品WWW夜色视频| 亚欧洲精品在线视频免费观看| 97国产在线播放| 欧美成成人免费| 大象传媒在线观看| 亚洲欧美一区二区三区| t66y最新地址| 欧美高清在线视频在线99精品| 怡红院av一区二区三区| 免费国产在线观看| 99久久人妻无码精品系列蜜桃| 男人桶爽女人30分钟视频动态图| 天使萌一区二区在线观看| 亚洲成在线观看| 黄色网址免费观看视频| 欧美一级片手机在线观看| 国产女人18毛片水真多| 中文字幕人妻三级中文无码视频| 豆奶视频最新官网| 思思久久99热只有频精品66| 人妻中文字幕在线网站| 一个人hd高清在线观看|