chapter-2

C++ Primer第二章!

#include "stdafx.h"
#include<iostream>

using namespace std;

int main()
{
    bool bl = true;
    char c = 'c';           //與機(jī)器字節(jié)一樣,大多數(shù)機(jī)器字節(jié)由8比特構(gòu)成。
    wchar_t wc = 'c';
    char16_t c16 = 'c';     //為Unicode字符集服務(wù)。可以儲(chǔ)存unicode的字符,而char也只能儲(chǔ)存ANSI字符!
    char32_t c32 = 'c';     //為Unicode字符集服務(wù)。
    short st = 1;
    int it = 1;
    long lt = 1;
    long long llt = 1;
    float ft = 0.1;         //1字節(jié)表示,7個(gè)有效位。
    double dt = 0.1;        //2字節(jié)表示,16個(gè)有效位。
    long double ldt = 0.1;

    //應(yīng)該避免混用帶符號(hào)類型和無符號(hào)類型!在無符號(hào)類型進(jìn)行減法運(yùn)算時(shí),應(yīng)該保證不為負(fù)數(shù)!
    unsigned char i1 = -1;
    cout << int(i1) << endl;        //unsigned char,賦值-1,所得結(jié)果為255。10000001原碼-11111110反碼-11111111補(bǔ)碼

    unsigned u2 = 10;
    int i2 = -42;
    cout << i2 + i2 << endl;
    cout << u2 + i2 << endl;            //int值轉(zhuǎn)換為無符號(hào)值,導(dǎo)致異常結(jié)果

    unsigned u3 = 42, u4 = 10;
    cout << u3 - u4 << endl;
    cout << u4 - u3 << endl;            //必須確保無符號(hào)變量不可能為負(fù)值,否者會(huì)導(dǎo)致未知錯(cuò)誤,當(dāng)應(yīng)用于循環(huán)時(shí)尤其注意。
    
    //初始化不是賦值,初始化是創(chuàng)建變量時(shí)賦予一個(gè)初始值,而賦值是把對(duì)象的當(dāng)前值擦除并以一個(gè)新值取代。
    int i3 = 1;
    int i4(1);
    int i5 = { 0 };                     //列表初始化,C11新規(guī)定。列表初始化,當(dāng)發(fā)生精度損失時(shí),會(huì)報(bào)告錯(cuò)誤!
    int i6{ 0 };

    double pi = 3.1415926;
    int i7 = pi;
    //int i8{ pi };                     //當(dāng)初始值存在丟失信息時(shí),使用列表初始化會(huì)報(bào)錯(cuò)!

    //在函數(shù)體內(nèi)部的內(nèi)置類型變量不被默認(rèn)初始化,其變量值是未定義的;在函數(shù)體之外的變量被初始化為0。所以,顯示初始化變量是非常必要的!
    //每個(gè)類決定其初始化對(duì)象方式,例如string默認(rèn)初始化為空串。由類的默認(rèn)構(gòu)造函數(shù)決定!

    //變量的命名規(guī)范:標(biāo)識(shí)符要體現(xiàn)實(shí)際含義;變量名一般用小寫字母;用戶自定義的類名用大寫字母開頭;如果標(biāo)識(shí)符由多個(gè)單詞組成,則單詞間應(yīng)有明顯區(qū)分。

    int ival = 1024;
    int &refVal = ival;             //引用,即對(duì)象別名,程序?qū)⒁煤退某跏贾到壎?。引用必須被初始化?    int *pVal = &ival;              //指針,指針本身就是一種對(duì)象。但是也建議進(jìn)行空指針初始化!
    cout << refVal << " " << *pVal << endl;

    //空指針,注意不能把int變量直接賦給指針。
    int *p1 = nullptr;//c++推薦方式!
    int *p2 = 0;
    int *p3 = NULL;

    //void*指針
    void *p4;
    //int *p5 = static_cast<int*>(p4);//強(qiáng)制類型轉(zhuǎn)換。

    //指向指針的指針
    int ival2 = 1024;
    int *p_ival2 = &ival2;
    int **pp_ival2 = &p_ival2;
    cout << ival2 << "-" << *p_ival2 << "-" << **pp_ival2 << endl;

    //指針是對(duì)象,所以有引用
    int ival3 = 1024;
    int *pi_ival3 = &ival3;
    int *&r_p_ival3 = pi_ival3;

    //const限定符,指向常量的引用
    const int ival3 = 1314;             //cosnt對(duì)象創(chuàng)建時(shí)必須初始化!
    const int ival4 = ival2;            //利用一個(gè)對(duì)象去初始化const對(duì)象。
    //extern const int ival5 = 1024;        //如果想在多個(gè)文件之間共享const對(duì)象,必須在對(duì)象定義時(shí)加上extern。
    const int &r_ival3 = ival3;         //cosnt常量引用,引用ival3對(duì)象。常量引用綁定非常量對(duì)象、字面值;非常量引用不允許綁定常量對(duì)象。

    //指向常量的指針
    const int *p_ival3 = &ival3;        //類似于指向常量的引用。
    //常量指針,即指針對(duì)象地址不能修改。
    int *const pp_ival3 = &ival3;       //指針將一直指向ival3.
    //指向常量的常量指針
    const int *const ppp_ival3 = &ival3;

    //頂層const和底層const
    //頂層const表示(指針)本身是個(gè)常量;底層const表示指針?biāo)傅膶?duì)象是一個(gè)常量。
    //const(底層) int *const(頂層) pp_ival3 = &ival3;

    //常量表達(dá)式:值不會(huì)改變并且在編譯過程就能得到計(jì)算結(jié)果。
    const int ival6 = ival3 + 520;
    //將變量聲明為constexpr,便由編譯器來驗(yàn)證變量是否是一個(gè)常量表達(dá)式。
    constexpr int ival7 = 520;      //如果確定變量為常量,則就把它聲明為constexpr。
    //算術(shù)類型、應(yīng)用和指針都是字面值類型,可以被定義為constexpr;而自定義類型string則不能!
    constexpr int *q = nullptr;     //如果constexpr定義指針,將所定義的對(duì)象置為頂層const。

    //類型別名
    typedef double wages;       //wages是double的同義詞,p是double*的同義詞。
    using uwages = wages;       //C++新的規(guī)定,別名聲明
    typedef wages *p;

    //auto類型說明符,通過初始值來推算變量的類型
    auto ai = 1;
    //auto一般會(huì)忽略掉頂層const,如果希望推斷頂層const,則需要明確指出
    const auto cai = 2;
    //還可以將引用的類型設(shè)為auto,此時(shí)頂層常量屬性仍然保留
    auto &rai = ai;

    //decltype類型指示符,返回操作數(shù)的數(shù)據(jù)類型,包括頂層const和引用在內(nèi)。即推斷指針為引用,推斷函數(shù)為函數(shù)類型!
    decltype(ai) dai = 2;
    //特別用法
    int di = 1, *dpi = &di, &dr = di;
    decltype(dr + 0) b;     //返回類型為int
    decltype(*dpi) dc = dr; //返回類型為int&
    decltype((di)) drr = dr;//雙括號(hào)的結(jié)果永遠(yuǎn)是引用

    //自定義數(shù)據(jù)結(jié)構(gòu)
    class Sales_data
    {
        string bookNo;
        unsigned units_sold = 0;            //類內(nèi)初始值,推薦使用值初始化。
        double revenue = 0.0;
    };

    Sales_data data1, data2;                //類通常被定義在頭文件中,而類所在頭文件的名字應(yīng)與類的名字一樣。

    //頭文件保護(hù)符,避免頭文件被多次包含,從而導(dǎo)致重復(fù)定義
    //  #ifndef SALES_DATA_H
    //  #define SALES_DATA_H
    //  #include<string>
    //  /*聲明和定義*/
    //  #endif

    cin.ignore();

    return 0;
}

//C++定義了算術(shù)類型和空類型,其中算術(shù)類型包括字符、整數(shù)、布爾值、浮點(diǎn)數(shù)。
//帶符號(hào)包含正數(shù)、負(fù)數(shù)、零;不帶符號(hào)包含大于等于0的值。不帶符號(hào)聲明:unsigned int i=1。
//signed char表示-128~127,unsigned char表示0~255,不要聲明char。
//當(dāng)明確知曉數(shù)值不可能為負(fù)時(shí),選用無符號(hào)類型;如果你的數(shù)值超出int范圍,選用long long;在算術(shù)表達(dá)式中不要使用char和bool,只有存放字符和布爾值時(shí)才使用它;執(zhí)行浮點(diǎn)運(yùn)算選用double。
//內(nèi)置類型轉(zhuǎn)換:0為false,否則為true;false為0,true為1;浮點(diǎn)數(shù)到整數(shù),僅保留整數(shù)部分;整數(shù)轉(zhuǎn)浮點(diǎn)型,小數(shù)部分為0,如果整數(shù)所占空間超過浮點(diǎn)型容量,否則精度有可能損失;給帶符號(hào)類型超范圍值,結(jié)果是未定義的;

第二章介紹了C++基本的數(shù)據(jù)類型(算術(shù)型+引用+指針)及其用法,另外也講解了C++對(duì)于復(fù)合類型的支持(類),

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容