最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ constexpr的使用小結

 更新時間:2026年02月08日 09:56:47   作者:Sichg  
constexpr是C++的修飾詞,用于指定編譯期可以求數(shù)值的常量表達式,可用于修飾變量,函數(shù),類/結構體,構造函數(shù)/析構函數(shù),模板五種情況,下面就來詳細的介紹 一下如何使用

constexpr是C++的修飾詞,用于指定“編譯期可以求數(shù)值的常量表達式”,可用于修飾變量,函數(shù),類/結構體,構造函數(shù)/析構函數(shù),模板五種情況,作用就是支持編譯期常量處理。constexpr的實際應用中最常用的是修飾變量和函數(shù)。

  • constexpr用于修飾變量,可以構建真常量,即編譯器常量。
  • constexpr用于修飾函數(shù),可以用于編譯期求值;
  • constexpr用于修飾類/結構體??梢杂脕碓诰幾g期構造對象;
  • constexpr用于修飾構造函數(shù)/析構函數(shù),可以在編譯器就對類對象進行初始化/銷毀;
  • constexpr用于修飾模板,在編譯期間完成模板實例化進行求數(shù)值。

增加編譯期間求解的效果是提升性能、增強類型安全。

實例1——constexpr修飾變量:

#include <iostream>
constexpr int MAXsize = 100; // 由constexptr修飾的int型真常量,
//在編譯期就可以通過直接賦值確定取值為100.
constexpr int OVERsize = MAXsize + 50;
//在編譯期可以通過計算得到確定取值為150.
//由constexpr修飾的MAXsize和OVERsize兩個真常量,分別取值100和150.
//編譯正常。符合處理直覺。

提問: constexpr 可以修飾變量,此時該變量是編譯期常量(值必須在編譯期確定,且生命周期內(nèi)不可修改,比 const 更嚴格)如果這個變量的取值在編譯期間沒有確定會報錯嗎?還是任意給這個變量取定一個隨機值?取定隨機值會導致這個變量實際沒有可用效果? 以及這里講的生命周期不可修改是什么意思?一個constexpr修飾的真常量的生命周期不就是整個程序運行的期間都有效嗎?編譯期常量即真常量是不占用C++堆內(nèi)存和棧內(nèi)存的吧!

解答:
// constexpr 修飾變量,這個變量的數(shù)值必須在編譯期確定,生命周期內(nèi)不可修改。
// 如果編譯期間這個變量的數(shù)值沒有確定指定,會直接編譯報錯,無隨機值。
// constexpr 修飾得到的真常量在生命周期內(nèi)都只具有只讀屬性,不可修改。
// constexpr 修飾得到的真常量的生命周期取決于變量定義所在的作用域決定。
    // 即constexpr只負責跟編譯器通力合作在編譯期間確定數(shù)值。
    // 至于這個真常量在何時失效取決于這個變量的自身的作用域,
    // 即定義在函數(shù)內(nèi)部的變量,即便加上constexpr修飾,
    // 這個真常量的生命周期依然只在函數(shù)內(nèi)的局部作用域效果下。constexpr修飾的真常量被存儲在靜態(tài)只讀數(shù)據(jù)區(qū)。

總結1:

  • constexpr修飾變量,得到真常量,存儲在靜態(tài)存儲區(qū),不占用運行內(nèi)存;(因此增強性能)
  • constexpr修飾得到的真常量,如果沒有在編譯期指定,直接報錯。
  • constexpr修飾得到的真常量,生命周期內(nèi)權限為只讀,不可修改。
  • constexpr修飾得到的真常量,生命周期長度取決于變量本身的生命周期。

實例2——constexpr修飾函數(shù):

表示這個函數(shù),如果入?yún)⑹蔷幾g期常量,在編譯期完成計算得到處理結果。如果入?yún)⒉皇蔷幾g期間常量,那就退化成普通函數(shù)。兩種情況都不會報錯。UDL和普通函數(shù)都支持這種退化兼容。

//constexpr修飾UDL(自定義字面值運算符)
constexpr long long operator "" _KM2m(long long kilometer) {
    return kilometer*1000;
}
//constexpr修飾普通函數(shù)
constexpr int add(int a, int b){
    return a + b;
}

實例3——constexpr修飾類/結構體:

作用是在編譯期構造類對象,即編譯期常量對象。 要求:

  • 類的構造函數(shù)必須是constexpr構造函數(shù);
  • 編譯期內(nèi)需調用的成員函數(shù)也必須有constexpr修飾;
  • 類的成員變量中,對于被constexpr使用/依賴的靜態(tài)成員變量,必須在類內(nèi)constexpr修飾。而且最好直接用static constexpr
//constexpr修飾結構體(在C++中將結構體視為類的一種)
struct Point{

    //constexpr 修飾構造函數(shù)
    constexpr Point(int x_, int y_) : x(x_), y(y_) {}
        // C++中約定俗成用 變量名右加下劃線 表示類成員變量的命名。
        // x(x_), y(y_) 是 C++ 中的「成員初始化列表(Member Initialization List)
            // 效果是將x_,y_的值對應賦值給x,y
            // `x(x_)` 和 `x=x_` 在初始化列表中等價
            
    //constexpr 修飾構造函數(shù)
    constexpr int get_x() const {
        return}
    }
    
    int x;
    int y;
   }
   
   int main () {
       //編譯器構造Ponit對象
       constexpr Point p0(10,20);
       //編譯期調用成員函數(shù),獲取數(shù)值
       constexpr int x_val = p0.get_x(); 
       return 0;
   }
  • 非靜態(tài)成員變量是指屬于單個對象的變量,每個對象獨一份,生命周期隨對象變化;
  • 靜態(tài)成員變量屬于類本身的,所有對象共享一份,生命周期貫穿程序。
    • 靜態(tài)const成員變量:類內(nèi)直接初始化,因為貫穿程序的生命周期,且在運行期間數(shù)值不可修改,是綁定在整個類上的變量。static const 變量類型 變量名 = 初始化數(shù)值;
      • static constexpr 變量類型 變量名 = 初始化數(shù)值; 效果更好。
    • -這里的static其實是指類共享。靜態(tài)變量本質是類共享變量;非靜態(tài)變量是類不共享變量。

實例4——constexpr修飾構造函數(shù)/析構函數(shù):

構造函數(shù)用constexpr修飾,要么非空要么只涉及基本四則運算和判斷的簡潔函數(shù)體。 析構函數(shù)用constexpr修飾,得到的效果是編譯期對象銷毀時沒有運行期開銷。 (constexpr修飾的效果要么是用于設定真常量,要么是能在編譯期間能處理的事情給處理了。)

class MyInt{

    public: 
        //構造函數(shù)
        constexpr MyInt (int val_) : val(val_) {}
        //析構函數(shù)
        constexpr ~MyInt() = default; //析構函數(shù)直接 = default 就行。
        //成員函數(shù)
        constexpr int get_val() const {
            return val;
        }

    private:
        int val;
};

int main() {
    //在編譯期構造 MyInt 對象
    constexpr MyInt mi(100);
    constexpr int val = mi.get_val(); // 編譯期求值為100
    return 0;
}

關聯(lián)說明類成員函數(shù)的const尾綴修飾: constexpr int get_val() const { return val; //這個const成員函數(shù)只讀取,沒有修改val的權限。 }

const成員函數(shù)

作用是限定這個成員函數(shù)對成員變量的操作權限僅僅是只讀。

  • 禁止修改類的非靜態(tài)成員變量,確保這個函數(shù)只進行只讀操作,不會改變對象的狀態(tài)。
  • 禁止調用非const成員函數(shù)。

const是 “承諾不修改成員變量”,僅支持運行期執(zhí)行;constexpr是 “支持編譯期求值”,

實例5——constexpr修飾模板template:

使模板實例化后具備編譯器求值能力。

template <template T>
    constexpr T max_val(T a, T b){
        return a > b ? a : b;
    }
    
int main() {
    constexpr int max_num = max_val(5,10);
    //編譯期求值: max_val(5,10)實例化得到int型數(shù)據(jù),取值為10.
    return 0;
}

到此這篇關于C++ constexpr的使用小結的文章就介紹到這了,更多相關C++ constexpr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Assert(斷言實現(xiàn)機制深入剖析)

    Assert(斷言實現(xiàn)機制深入剖析)

    言前后最好空一格[編程風格的問題,按你自已的喜好,適合自已就最好]。斷言只是用來檢查程序的邏輯正確性,不能代替條件替換。斷言比printf語句這種形式的打印好使
    2013-09-09
  • vscode配置遠程開發(fā)環(huán)境并遠程調試運行C++代碼的教程

    vscode配置遠程開發(fā)環(huán)境并遠程調試運行C++代碼的教程

    這篇文章主要介紹了vscode配置遠程開發(fā)環(huán)境并遠程調試運行C++代碼的教程,本文通過截圖實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 詳細聊聊c語言中的緩沖區(qū)問題

    詳細聊聊c語言中的緩沖區(qū)問題

    緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分,也就是說在內(nèi)存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預留的空間就叫做緩沖區(qū),這篇文章主要給大家介紹了關于c語言中緩沖區(qū)問題的相關資料,需要的朋友可以參考下
    2021-11-11
  • VC++ 6.0 C語言實現(xiàn)俄羅斯方塊詳細教程

    VC++ 6.0 C語言實現(xiàn)俄羅斯方塊詳細教程

    這篇文章主要為大家介紹了VC++ 6.0 C語言實現(xiàn)俄羅斯方塊詳細教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 一文搞懂Codec2框架解析

    一文搞懂Codec2框架解析

    這篇文章主要介紹了Codec2框架解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++創(chuàng)建多線程的方法總結

    C++創(chuàng)建多線程的方法總結

    下個迭代有個任務很有趣,用大量的線程去訪問一個接口,直至其崩潰為止,這就需要多線程的知識,這也不是什么難事,本文總結一下C++中的多線程方法std、boost、pthread、windows?api,感興趣的朋友可以參考下
    2024-01-01
  • 獲取C語言中int類型的最大值的方法小結

    獲取C語言中int類型的最大值的方法小結

    在C語言中,int?類型的大小通常是根據(jù)系統(tǒng)架構來決定的,在大多數(shù)現(xiàn)代系統(tǒng)上,int?通常是32位的,在C語言中,獲取int類型的最大值有幾種不同的方法,下面,我們將討論兩種方法:使用標準庫函數(shù)和使用算法,需要的朋友可以參考下
    2024-06-06
  • C++解決TCP粘包的問題實現(xiàn)

    C++解決TCP粘包的問題實現(xiàn)

    本文主要介紹了C++解決TCP粘包的問題實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • C/C++在VScode中的配置教程詳解

    C/C++在VScode中的配置教程詳解

    這篇文章主要介紹了C/C++在VScode中的配置教程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Qt QStandardItemModel用法小結

    Qt QStandardItemModel用法小結

    QStandardItemModel可用作標準Qt數(shù)據(jù)類型的存儲庫,本文主要介紹了Qt QStandardItemModel用法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12

最新評論

丰顺县| 湖口县| 泽州县| 南平市| 黄陵县| 铜鼓县| 铁岭市| 陇川县| 卓尼县| 锡林郭勒盟| 新民市| 大英县| 裕民县| 防城港市| 新竹市| 安宁市| 田林县| 岳普湖县| 华阴市| 桐乡市| 成都市| 贡山| 靖边县| 临汾市| 石屏县| 广德县| 寻甸| 辰溪县| 凌云县| 扬州市| 牟定县| 昌江| 阿瓦提县| 亳州市| 北海市| 济阳县| 祁东县| 河间市| 喜德县| 二手房| 常熟市|