臨時記錄-C++常量相關

對const無論聲明還是定義都使用extern,就能實現常量在多個文件中共享。

    比如在其中一個源文件定義,在公共頭文件聲明。有值的地方就是定義的地方,但是都有extern。

    對常量的引用也必須有const的常量引用才能接收綁定(也就是說,必須要常量引用來引用常量)

   

    指向常量的引用(包含const的引用),也可以引用一個普通變量、表達式,甚至值。其作用是,對所引用對象操作做了限制(不允許通過此引用改動),但是還是能夠通過其它途徑改變的。

    const int v;

    const int &rv=v;

    以上,v是常量,而rv是常量引用。

   

    說法上,有:對常量的引用/常量引用、常量

   

    C++中常量引用可以被字面值初始化,但是普通引用不能。

    類似指向常量的引用,也有指向常量的指針。對常量,必須用指向常量的指針來指向常量,同樣指向常量的指針指向普通變量限定的只是通過該指針不能修改對應的變量。

    const int v;//常量

    const int *p = &v;// *指向常量的指針*

    int *const pc = &v;//報錯,此處是 *常量指針* ,因爲pc本身所指地址不能變,但是所指地址值可變,而這裏所指地址值是一個const常量。

    const int *const pcc =&v;//指向常量的常量指針,前面const表示指針自認爲所指爲“常量”(不能通過自己改變其值),後面的表示指針本身所指不能改變。

    以上,v是常量,p是指向常量的指針(底層const,即間接地p地址值所指值不可變,但p本身值即所指地址可變,)。pc是常量指針(頂層const,即直接p本身值即所指地址就不可變了,但p地址值所指值可變)。

   

    說法上,有:指向頂層常量屬性、底層常量屬性、常量的指針(只能是常量指針)、常量指針(指針本身值不能變指針可變但指針不改變所指值)、常量。其中,常量指針是因爲指針本身是一個對象,所以可以做爲常量存在。其中,常量指針是頂層常量屬性,指向常量的指針是底層常量屬性。

    初始化常量時的表達式,並不一定是常量表達式(可能在運行才能確定)。constexpr類型的變量,一定是常量,並且必須用常量表達式初始化,並且在編譯期間就能確定變量值。

    constexpr類型的一般都是字面值類型,一般就是能用表達式表達的內部類型,而一般自定義類型都無法用一個表達式表達出來。另外,指針和引用如果是constexpr,則必須指向固定的區域,而比如函數內部臨時變量就不固定所以不行。

    如果constexpr定義指針,那麼限定符constexpr僅對指針有效而非指向的對象, 即:指針是常量指針。而非如同const定義的那樣指向常量的指針。

<span class="timestamp-wrapper"><span class="timestamp"><2019-11-05 二 10:10></span></span>2.5.1 關於類型別名

    類型別名兩種方式:typedef, using

    對常量修飾別名,需要注意,別名做爲一個整體,而非簡單替換了。比如:

    typedef char * pstr;

    const pstr p;// 首先類型是“指針”這個整體,然後const 相當於直接修飾了p, p成了常量,所以 應該是常量指針,而非替換形成的:const char* p這樣的指向常量的指針。

    const *pstr pp;//首先,pstr是“指針”這個整體,然後const *修飾使得pp它成爲指向常量的指針,而若常量爲pstr類型,那就是常量指針,所以pp是一個指向常量指針的指針。

<span class="timestamp-wrapper"><span class="timestamp"><2019-11-05 二 11:05> </span></span> 2.5.2關於auto

    auto類型,是C++11新標準,該類型變量必須初始化,根據初始化值來推斷變量的真正值。形式如:auto val=xxx;

    auto用一條語句聲明多個變量時,這些變量的初始值類型必須一致(甚至不能多出頂層const屬性)。

    auto聲明時會去掉頂層const屬性,但是保留底層const屬性。

    auto的引用auto&,則保留頂層const屬性。

<span class="timestamp-wrapper"><span class="timestamp"><2019-11-05 二 11:07> </span></span> 2.5.3關於decltype

    decltype也是C++新標準,傳給它一個表達式得出表達式類型(而不是計算這個表達式),

    然後用這個類型來聲明變量,形式如:decltype(表達式) val; 根據表達式來計算得出val的類型。

    如果表達式是變量,類型就是變量類型,如果是用括號擴起來的變量,則類型是一個變量類型的引用。

    如果表達式是對指針的解引用,即(*p取值),那麼表達式也是引用。

    如果表達式是賦值表達式,那麼它也會產生引用類型

<span class="timestamp-wrapper"><span class="timestamp"><2019-11-05 二 11:15> </span></span> 2.6 自定義數據結構(未讀)

    C++11新標準可以設置類內初始值,設置初始值不能用括號,沒有初始值將被默認初始化。

<span class="timestamp-wrapper"><span class="timestamp"><2019-11-06 三 10:28> </span></span> 第3章,字符串、向量、數組

    頭文件中一般不使用using聲明

    對於string,不能把字面值同時相加,如果相加string,則必須有一個操作數是string類型

    爲了兼容C,C++包含name.h文件時,也可用cname的方式包含。直接用 cname 包含的會在std命名空間中,而用name.h包含的,則不在std空間中,建議C++中包含c標準庫頭文件用cname的方式進行。

    基於範圍的for語句C++11最新引入的語法,形式:

    for(declaration:expression)

        statement

   

    例如:

    for(auto c: str_list)

    xxx

   

    如果這裏的是引用的 auto &c, 那麼會被依次綁定到每個元素。

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