const和constexpr

const和constexpr

#include <iostream>

using namespace std;
/**
const
    //限定修飾,防止在之後的代碼中被修改
        1,如果由一個常量表達式賦值,在編譯時執行
        2,如果不是常量表達式(無法具體確認他的值),在運行時賦值;
    //只在本文件中有效(默認狀態下),如果要在其他文件使用這個常量
        1,在每個文件中都定義一次(每個文件的該常量都是單獨的一個)
        2.加extern 定義:extern const int a=10; 其他文件中聲明:extern const int a;(多個文件中的a都是一個內存)
constexpr
    //和const一樣,但聲明的同時必須給他附一個常量表達式,且只在編譯的時候初始化
    //如果你認爲一個變量是常量表達式(在編譯的時候就能確認他的值),那就直接聲明爲constexpr
        而不是const(const)無法保證你在聲明的的時候到底是不是確認的一個值,有可能在運行時初始化的結果和你想的不一樣

常量標達式:
    const int a=20;//a 是常量表達式,20是
    const int b=a+1;//b 是,a+1是
    int c=20;//c 不是,在運行是才確定他的值,20是
    const int d=get_len();//d 不是,函數只有運行的時候才能確定他的返回值,get_len不是
                          //聽說有一種constexpr函數,如果該函數是constexpr函數,get_len()是常量表達式,d也是;
    //還有一點與const不同的是,const可以修飾所有對象,而constexpr 只能修飾字面值類型(算數類型(基本的類型int,char,,,),引用,指針)
        而自定義類就不行,(包括庫裏定義的類)
*/
char aaa[10]="123456789";
const char *  pp=aaa;
constexpr char * ppp=aaa;
//這兩個根本不一樣,一個是指針指向常量
//一個是指針指自己不能被修改

/***關於constexpr實在是感覺怪怪的,一想到平時都不會怎麼用到這些玩意36D的胸口就一陣絞痛。。。日後回了在更吧。。。***/
int main()
{
    const int a=10;//編譯時初始化
    //a=20; //錯誤 const限定一次定義後不能被修改
    //const int c;//錯誤 必須在初始化的時候賦初值i
    int d=a;//可以給一個變量對象賦值,只是把一個數子賦給了d變量,再沒有其他關係
    const int e=d;//可以把一個變量的值賦給常量,只是把一個數子賦給了d變量,再沒有其他關係

    const int &ai=a;//可以將一個常量引用一個常量,引用後自然也不能修改
    //ai=2;//錯誤不能修改
    const int &di=d;//可以用一個常引用引用一個變量,但是不能通過該引用改變該變量的值
    //di=2;//錯誤 不能修改
    d=2;//當然我可以用他自己來改變,這樣di自然也變了,但不是且不能通過他來改變

    const int *p1;//一個指針變量,指向一個常量
    p1=&a;
    p1=&d;//可以讓常量指針,指向一個變量,但和上面的引用一樣不能用這個指針修改他指向的內存的值(就不舉例了)
    int *const p2=&d;//一個常量,是指針類型的 因爲他是一個常量必須賦初值,這個指針就只能指向這一個固定的地方
    *p2=4;//指針指向的地址不可以被修改,但他指向的值是個變量可以修改,
    const int *const p3=&a;//一個指針是常量,指向的內容也是常量,他自己不可修改,他指向的內容也不可修改,
                             //當然他也要遵循上面的基本規則,定義的時候賦初值,
    const int *const p4=&d;//和上面一樣,可以給他賦一個變量地址,但以後不能通過該指針修改變量的值。
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章