C++ primer plus V6 泛讀知識(shí)點(diǎn)

2018年8月17日 22:14:16


title: C++PrimerPlus讀書(shū)筆記
typora-root-url: ..
typora-copy-images-to: ..\img\root
date: 2018-08-15 22:55:29
tags:
c++
學(xué)習(xí)
categories:
學(xué)習(xí)


C++PrimerPlus讀書(shū)筆記

第一章

  • C++融合了C的面向過(guò)程,添加了以類(lèi)為代表的面向?qū)ο?,模板支持的泛型編?
  • C是一種結(jié)構(gòu)化編程的語(yǔ)言.強(qiáng)調(diào)算法.C++ 強(qiáng)調(diào)的是一種數(shù)據(jù)結(jié)構(gòu)
  • 擴(kuò)展名大小寫(xiě),c是標(biāo)準(zhǔn)的c,C是支持C++的C

第二章

  • end1\n相比,都可以執(zhí)行換行,但是會(huì)刷新輸出緩沖.
  • token是代碼中不可分割的元素
  • 聲明包含了定義聲明和引用聲明兩種形式
  • cin中的<<是進(jìn)行了運(yùn)算符重載,所以他能實(shí)現(xiàn)各種格式輸出
  • linux使用命令鏈接函數(shù)庫(kù)g++main.c -lm
  • using namespace 放在函數(shù)中,則只對(duì)函數(shù)起作用,放在函數(shù)外,則對(duì)所有函數(shù)有用

第三章

  • 內(nèi)置類(lèi)型分為基本類(lèi)型(整數(shù)和浮點(diǎn)數(shù))和復(fù)合類(lèi)型(數(shù)組,字符串,指針,結(jié)構(gòu))
  • 以?xún)蓚€(gè)下劃線或者一個(gè)下劃線和大寫(xiě)字母打頭的名稱(chēng)被保留,以及一個(gè)下劃線打頭的用作全局標(biāo)識(shí).P38
  • short至少16位,int至少與short一樣長(zhǎng),long至少32位,至少=int,long long 至少64位,至少=long,在limits中限制
  • 變量初始化方式
    • c++ 可以使用類(lèi)似int i(60);初始化變量,這類(lèi)似將int看作一個(gè)class,60為構(gòu)造函數(shù)的參數(shù)?
    • 也可使用{},如果括號(hào)為空則為0,可以 int enum{7},也可以 int a={2}.
  • 數(shù)字后面的后綴 u/U表述無(wú)符號(hào),l/L標(biāo)識(shí)long
  • cinput()可以輸出char的字符
  • 通用字符名以\u或者\U打頭,\u后面是8個(gè)十六進(jìn)制位,\U后面是16個(gè)十六進(jìn)制位,用來(lái)擴(kuò)展編碼,
  • wcha_t可以存儲(chǔ)漢字和日文,長(zhǎng)度由編譯器確定,是一種整數(shù)類(lèi)型,不能使用cin/cout,可以使用wcin,wcout.
  • char16_t(u作為前綴)和char32_t(U作為前綴)也是用來(lái)標(biāo)識(shí)字符
  • C中一般將0解釋為false
  • ==const==在C和C++中有所不同,一個(gè)是作用域規(guī)則,一個(gè)是const可以聲明數(shù)組長(zhǎng)度
  • 可以使用E來(lái)標(biāo)識(shí)浮點(diǎn)數(shù),標(biāo)識(shí)10的多少次方,d.dddE+n是將小數(shù)點(diǎn)右移,~n是左移
  • 浮點(diǎn)類(lèi)型有float,double,long double.float至少32位,double至少48位且不少于float,long double至少=double,可以從float.h看到限制,c++在cfloat
  • 使用cout.setf可以設(shè)置顯示精度
  • 浮點(diǎn)常量默認(rèn)使用double存儲(chǔ),可以用后綴f,F指定float,用L,l指定Longdouble
  • ==float只能保證6位有效精度==
  • 優(yōu)先級(jí),附錄D.先判斷優(yōu)先級(jí)分組,再判斷結(jié)結(jié)合性,所以同一優(yōu)先級(jí)的結(jié)合性是一樣的,從左往右的結(jié)合性說(shuō)明對(duì)于操作數(shù),先運(yùn)行左側(cè)的運(yùn)算符.P60
    • 注意:20*5+30*6,是先計(jì)算左邊的20*5還是右邊的30*6主要靠編譯器的實(shí)現(xiàn).雖然*的結(jié)合性是從左到右,但是并不是作用在同一個(gè)操作數(shù)
  • 簡(jiǎn)單的運(yùn)算符重載:
    • 9/5 int除法
    • 9.0/5.0 double
    • 9L/5L long觸發(fā)
  • 潛在的類(lèi)型轉(zhuǎn)換p64
    • 賦值時(shí)的隱式轉(zhuǎn)換
    • 表達(dá)式中有不同的類(lèi)型
      • short提升到int..這個(gè)在c里面應(yīng)該沒(méi)有
      • 不同類(lèi)型,小類(lèi)型轉(zhuǎn)換為大類(lèi)型
    • 參數(shù)傳遞
  • 強(qiáng)制類(lèi)型轉(zhuǎn)換
    • 形如 (int)tepm
    • c++新增 int(temp),這樣int看著就是一個(gè)函數(shù)風(fēng)格
    • c++還有強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符號(hào)4種P65
      • static_cast <long> (temp)

第四章

  • 初始化一個(gè)數(shù)組為0,只需要顯示的初始化第一個(gè)元素為{0}
  • c++中有以下新的特性
    • int a[4]{1,2,3,4};
    • 在{}可以不寫(xiě)值,都為0
    • 列表初始化可以禁止一些縮窄的轉(zhuǎn)換 比如float到int
  • 數(shù)組的替代復(fù)雜用法:模版類(lèi)vector和模版類(lèi)array
  • cin默認(rèn)讀取到空白,可以使用getline和get讀行,使用getline會(huì)丟棄下一個(gè)換行,get并不會(huì),
    • cin.clear
  • string類(lèi)的簡(jiǎn)單用法
    • 允許直接相互賦值
    • 允許使用+
  • 支持其他編碼格式的字符串
  • 支持RAW的字符串,里面就沒(méi)有轉(zhuǎn)義了,以R開(kāi)頭,形如R"(xxxxxxxxxxxxxx)",允許在R"(加上x(chóng)xx,這樣之后,尾巴也要使用)"加入一樣的,形如R"xxx(YYYY)xxx",中間的YYY是實(shí)際的
  • 可以將RAW與w_char等結(jié)合,如Ru,UR暫時(shí)放著
  • 在定義變量的時(shí)候可以省略struct,與c的結(jié)構(gòu)相比,允許放置成員函數(shù),同樣支持位域
//聲明結(jié)構(gòu)類(lèi)型
struct ab{
int a;int b;
}
//c這樣聲明變量
struct ab tmp1;
//c++  可以省略struct
ab tmp2;
//還有以下用法

struct structName
{
    int a ; int b;
}tmpname;
當(dāng)有tmpname的時(shí)候可以省略structName,這樣只能用一次,這時(shí)候還可以直接初始化.
struct 
{
    int a ; int b;
}tmpname={0,1}

//還可以這么賦值,c99以后支持的,韋東山有講
tmpname={.b=xxx;.a=xxx}
  • 公用體支持匿名公用體,這樣可以少寫(xiě)這個(gè)公用體的名字

#include <stdio.h>
 
struct person
{
    char    *name;
    union
    {
        char gender;
        int  id;
    };
    int      age;
};
 
int main(void)
{
    struct person jim = {"jim", 'F', 28};
 
    printf("jim.gender = %c, jim.id = %d\n", jim.gender, jim.id);
 
    return 0;
}
  • 如果只是為了使用枚舉常量,不聲明枚舉變量,可以忽略枚舉名稱(chēng),也就是匿名枚舉.c++中的枚舉默認(rèn)是int,但有>int的,則使用4字節(jié)long,這有個(gè)詞==作用域內(nèi)枚舉==
  • int * a, b; b是int.不是指針
  • 使用new為指針?lè)峙渥兞?int * pt = new int;//pt是個(gè)指針,new是從堆heap和自由存儲(chǔ)區(qū)中分配內(nèi)存,定義變量是在棧.(單片機(jī)的有點(diǎn)不一樣)
  • delete釋放內(nèi)存 int* pt=new int;delete pt;不能使用delete釋放釋放過(guò)的內(nèi)存,結(jié)果未知,也不能釋放定義變量的內(nèi)存.delete 對(duì)應(yīng)的是地址,感覺(jué)應(yīng)該是那個(gè)地址包含了長(zhǎng)度,類(lèi)型的鏈表, 可以delete 同樣地址的指針,int* pt2;pt2=pt;delete pt2;
  • 數(shù)組名和指針的區(qū)別:1 數(shù)組名是常亮,不能執(zhí)行運(yùn)算 2. sizeof指針=4 32位系統(tǒng)
  • ==數(shù)組名取地址==,對(duì)于一個(gè)數(shù)組 short tell[10];,存在以下三個(gè)地址
    • &tell[0]=數(shù)組的地址
    • tell=&tell[0]=數(shù)組的地址
    • &tell,這個(gè)是一個(gè)二級(jí)指針了,他指向了tell,也就是*(&tell)=tell,指向了包含20個(gè)元素的數(shù)組
      • []優(yōu)先級(jí)高于*,所以我們定義一個(gè)指針指向了一個(gè)20元素的數(shù)組這么定義 short ( *p)[20]=&tell
short tell[10];
cout<<tell<<endl;
cout<<&tell<<endl;
//從地址上看兩者是相等的,但是&tell[0]=tell是一個(gè)2字節(jié)的內(nèi)存地址,&tell是一個(gè)20字節(jié)的地址,所以tell+1是地址加2,&tell+1是加了20,
//可以這么來(lái)一個(gè)指針 
short (*p) [20]=&tell;
  • 結(jié)構(gòu)體指針成員的獲取,a->b 或者 (*a).b
  • vector 模版類(lèi),使用vector <int> vi; vector <char> ch(10);
  • 模版數(shù)組array,與模版類(lèi)不同,他是用棧的 ,但是也支持new和delete array<int,5> ai;與模版類(lèi)不同,他創(chuàng)建的對(duì)象大小是固定值,不能是變量
  • 數(shù)組,模版類(lèi),模版array都可以使用數(shù)組下標(biāo)訪問(wèn),諸如越界a[-2]默認(rèn)情況也是允許的跨界了,如果要檢查可以使用模版類(lèi)/模版數(shù)組的成員函數(shù)at,形如a.at(1)=a[1]模版類(lèi)是動(dòng)態(tài)數(shù)組的替代,模版類(lèi)array是靜態(tài)數(shù)組的替代.模版數(shù)組支持直接復(fù)制.

第五章

  • 在c中,表達(dá)式成立為1,false為0,但在C++引入bool后,關(guān)系表達(dá)式是來(lái)判斷bool的,C++在需要整數(shù)的時(shí)候?qū)rue和false轉(zhuǎn)換為1,0,在需要bool值的時(shí)候0為false,非0為true
  • 設(shè)置顯示格式:cout.setf(ios_base::boolalpha);設(shè)置為顯示bool還是true
  • 表達(dá)式是沒(méi)有分號(hào)的,有些表達(dá)式會(huì)對(duì)內(nèi)存變量等有影響,有些沒(méi)有,加上;就是語(yǔ)句了,所以可能會(huì)有a+3;這種沒(méi)有意思的語(yǔ)句.
  • 對(duì)于在for內(nèi)部的int變量,新的標(biāo)準(zhǔn)是在==內(nèi)部有效==,老的標(biāo)準(zhǔn)是將定義置于for之前for(int a; a<5;a++)
  • using聲明與using編譯指令 Using std::coutUsing std
  • 順序點(diǎn)與執(zhí)行順序的問(wèn)題,在循環(huán)語(yǔ)句中,一個(gè)表達(dá)式結(jié)束才會(huì)進(jìn)入另外一個(gè)語(yǔ)句,表達(dá)式結(jié)束意味其中的++等操作已經(jīng)實(shí)現(xiàn)了其副作用,但是類(lèi)似 y=(1+a++)+(6+a++),沒(méi)有規(guī)定左右哪個(gè)先執(zhí)行
  • 對(duì)于類(lèi)而言,前綴++效率更高
  • 優(yōu)先級(jí)淺析*++p 前綴遞增與*優(yōu)先級(jí)相同,從右往左,所以先結(jié)合右 ++pt,再*(++pt)
  • x=*pt++,后綴優(yōu)先級(jí)更高,所以先 pt++,但是后綴運(yùn)算意味著對(duì)原來(lái)的地址操作也就是x=*pt
  • 逗號(hào)運(yùn)算符表達(dá)式,返回右側(cè)的值
  • for允許使用類(lèi)似for int i : iarrar[10]或者for int &i : iarrar[10]來(lái)修改數(shù)組
  • C++改變參數(shù)的值可以不使用指針,只需要將參數(shù)聲明為引用istream& cin.get(char& var);,這么用cin.get(a)就能改變A的值,關(guān)于引用能改變參數(shù)值,其實(shí)就是傳遞地址了

第六章

  • 文件操作

  • cin輸入P187

    https://blog.csdn.net/K346K346/article/details/48213811

    cin輸入流的機(jī)制是:

    當(dāng)遇到無(wú)效字符或遇到文件結(jié)束符(不是換行符,是文件中的數(shù)據(jù)已讀完)時(shí),輸入流cin就處于出錯(cuò)狀態(tài),即無(wú)法正常提取數(shù)據(jù)。此時(shí)對(duì)cin流的所有提取操作將終止。在 IBM PC及其兼容機(jī)中,以Ctrl + Z表示文件結(jié)束符。在UNIX和Macintosh系統(tǒng)中,以 Ctrl + D表示文件結(jié)束符。當(dāng)輸入流cin處于出錯(cuò)狀態(tài)時(shí),如果測(cè)試cin的值,可以發(fā)現(xiàn)它的值為false(假),即cin為0值。如果輸入流在正常狀態(tài),cin的值為true(真),即cin為 一個(gè)非0值??梢酝ㄟ^(guò)測(cè)試cin的值,判斷流對(duì)象是否處于正常狀態(tài)和提取操作是否成功。如:
    if(!cn) //if表達(dá)式判斷為真時(shí)cin輸入流處于出錯(cuò)狀態(tài),無(wú)法正常提取數(shù)據(jù)
    cout<<"error";

    錯(cuò)誤處理

    • 重置cin以接受新的輸入
    • 刪除錯(cuò)誤的輸入cin.clear()是用來(lái)更改cin的狀態(tài)標(biāo)示符的。通俗的講就是將一個(gè)出錯(cuò)的“流”恢復(fù)為“好”,并設(shè)置goodbit狀態(tài)位。
    • 提示輸入
    #include<iostream>
    const int Asize = 5;
    int main()
    {
        using namespace std;
        int golf[Asize];
        int i,sum = 0;
        float ave;
        for(i = 0;i < Asize;i++)
        {
            cout << "round # " << i + 1;
            while(!(cin >> golf[i]))
            {
                cin.clear();
                while(cin.get() != '\n')
                {
                    continue;
                }
                cout << "Please enter a number:";
            }
        }
        for(i = 0;i < Asize;i++)
        {
            sum = sum + golf[i];
        }
        ave = (float)sum / Asize;
        cout << ave << endl;
        return 0;
    }
    
    
    1. cin>> ,當(dāng)cin>>從緩沖區(qū)中讀取數(shù)據(jù)時(shí),若緩沖區(qū)中第一個(gè)字符是空格、tab或換行這些分隔符時(shí),cin>>會(huì)將其忽略并清除,繼續(xù)讀取下一個(gè)字符,若緩沖區(qū)為空,則繼續(xù)等待。但是如果讀取成功,字符后面的分隔符是殘留在緩沖區(qū)的,cin>>不做處理。
    2. cin.get 關(guān)于cin.get()和cin.get(ch)區(qū)別P159
    int cin.get();
    istream& cin.get(char& var);
    istream& get ( char* s, streamsize n );
    istream& get ( char* s,  streamsize  n, char delim )。
    
    • cin.get讀取一個(gè)字符 cin.get或者cin.get(var),cin.get()從輸入緩沖區(qū)讀取單個(gè)字符時(shí)不忽略分隔符.cin.get()的返回值是int類(lèi)型,成功:讀取字符的ASCII碼值,遇到文件結(jié)束符時(shí),返回EOF,即-1,Windows下標(biāo)準(zhǔn)輸入輸入文件結(jié)束符為Ctrl+z,Linux為Ctrl+d。cin.get(char var)如果成功返回的是cin對(duì)象,因此可以支持鏈?zhǔn)讲僮?,如cin.get(b).get(c)。
    • cin.get讀取一行,讀取一行可以使用istream& get ( char* s, streamsize n )或者istream& get ( char* s, size_t n, streamsize delim )。二者的區(qū)別是前者默認(rèn)以換行符結(jié)束,后者可指定結(jié)束符。n表示目標(biāo)空間的大小。
      • cin.get(array,20);讀取一行時(shí),遇到換行符時(shí)結(jié)束讀取,但是不對(duì)換行符進(jìn)行處理,換行符仍然殘留在輸入緩沖區(qū)。這也是cin.get()讀取一行與使用getline讀取一行的區(qū)別所在.cin.get(str,size);讀取一行時(shí),只能將字符串讀入C風(fēng)格的字符串中,即char*,但是C++的getline函數(shù)可以將字符串讀入C++風(fēng)格的字符串中,即string類(lèi)型。鑒于getline較cin.get()的這兩種優(yōu)點(diǎn),建議使用getline進(jìn)行行的讀取。
    • cin.getline,cin.getline不會(huì)將結(jié)束符或者換行符殘留在輸入緩沖區(qū)中。
    istream& getline(char* s, streamsize count); //默認(rèn)以換行符結(jié)束
    istream& getline(char* s, streamsize count, char delim);
    
    • exit()是定義在cstdlib中的,exit(EXIT_FAILURE),中間的EXIT_FAILURE是系統(tǒng)通信參數(shù)

    • ==文件操作==ifsream 和 ofstream,fstream

      • 判斷是否成功打開(kāi) file.is_open

      • file.good能夠判斷錯(cuò)誤,輸入正確,并且沒(méi)有EOF

      • 讀取的時(shí)候不能超過(guò)EOP,如果遇到EOF,方法eof返true

        while(inflie.good())
        {
          infole>>value;
        }
        //還可以精簡(jiǎn)如下p197
        while(infole>>value)
        {
          //do
        }
        
        

第七章

  • 二維數(shù)組作為參數(shù)傳遞示例
int data[3][4]={{1,2,3,4},{2,2,3,4},{3,2,3,4}};
int total=sum{data,3}

//原型
int sum(int (*pt)[4],int size)//這里(*pt)要有括號(hào),否則就是 pt[4] 然后是個(gè)int 指針,是個(gè)指針數(shù)組了
//或者
int sum(int pt[][4],int size)
  • 局部指針不能返回,c++中使用new分配內(nèi)存是允許的,可以在外部刪除
  • 結(jié)構(gòu)體名字知識(shí)結(jié)構(gòu)的名稱(chēng),需要&取址,早期的c不允許直接按值傳遞結(jié)構(gòu)只能傳遞地址,c++允許傳值,可以用指針,也可以使用引用
  • 結(jié)構(gòu)體允許直接復(fù)制,里面的指針是淺復(fù)制
  • 模版類(lèi),數(shù)組模版?zhèn)鬟f指針作為參數(shù)void fill (std::array<double,3> *pa)
  • 遞歸,在遞歸中,每一層的局部變量都有字節(jié)的地址存儲(chǔ)單元.
  • 函數(shù)指針,標(biāo)識(shí)這是一個(gè)指針,指向了一個(gè)函數(shù)double (*pt)(int),pt是個(gè)指針,指向一個(gè)函數(shù),一般情況下聲明一個(gè)函數(shù)指針,可以先寫(xiě)出這個(gè)函數(shù)的原型,再將名字換成(pt),在這里(*pt)等同與函數(shù)名,可以直接使用(pt)(參數(shù));
  • 指針函數(shù),標(biāo)識(shí)這是一個(gè)返回值是指針的函數(shù)double * pt(int),因?yàn)槔ㄌ?hào)優(yōu)先級(jí)高,所以先和pt結(jié)合,說(shuō)明這是函數(shù),返回值為double *
  • 在函數(shù)中,允許省略標(biāo)識(shí)符,下面三個(gè)是一樣的
f1(const double ar[],int n)
f2(const double [],int )
f3(const double *,int )  
  • 函數(shù)指針數(shù)組const double * (*pa[3])(const*,int)={f1,f2,f3};
      1. pa是個(gè)數(shù)組,他的類(lèi)型是*,也就是一個(gè)指向指針的數(shù)組
      2. 指針的類(lèi)型是 const double * xxx(const double*,int),也就是說(shuō)指針是個(gè)函數(shù) xxx(const double *,int),參數(shù)是(const double* ,int),返回值是 const double *
  • auto 只能用于單值初始化,不能用于初始化列表,這個(gè)不太理解 P245,應(yīng)該是 auto b=a; a是已知的一個(gè)值.
///都忽略參數(shù)

//step1
//pt是個(gè)指針,指向一個(gè)函數(shù),
double (*pt)(int)
//pt是個(gè)函數(shù),返回一個(gè) double*
double * pt(int) 
    
//step2
// pt是個(gè)函數(shù),返回值為 double *
const double * pt(const double *,int)
//pt是個(gè)指針,指向一個(gè)返回值為 double*的函數(shù)
const double * (*pt)(const double* ,int)
    
//step3
//[]優(yōu)先級(jí)高于*,所以pt是個(gè)數(shù)組,類(lèi)型為*,也就是是個(gè)指針的數(shù)組,數(shù)組里存的是指針,指向了一個(gè)函數(shù)
const double * (*pt[3]) (const double* ,int)
    
//step4
//構(gòu)造一個(gè)指針,指向step3,簡(jiǎn)單的理解就是將pt改為(*pt1)就ok,pt1指向step3的數(shù)組
//1.pt是個(gè)指針  (*pt)
//2.指向一個(gè)數(shù)組 (*pt)[3]
//3.該數(shù)組的類(lèi)型是個(gè)指針,我們定義一個(gè)數(shù)組,數(shù)組的元素類(lèi)型為 int* 的話,這么定義  int* a[3];
    //同上,    (type)* (*pt)[3] 也就是↓
const double * (*(*pt)[3]) (double * ,int)
  • const從右往左讀.... 列入const int *p 就是p is a pointer to a int which is constant...其它的都可以那么讀...

第八章

  • 宏在某些情況下會(huì)有問(wèn)題,不能傳遞參數(shù),比如參數(shù)是(i++)這樣的話使用替換可能導(dǎo)致內(nèi)部有多次i++
  • 在創(chuàng)建引用變量中int & b=a;注意這里的&不是取址,而是類(lèi)型標(biāo)識(shí)的一部分,應(yīng)認(rèn)為是指向int變量的引用
  • 引用與指針的一個(gè)區(qū)別,必須在聲明引用的時(shí)候初始化.更像 const指針
  • 早期的編譯器允許引用是個(gè)常量,或者類(lèi)型不匹配,為其創(chuàng)造一個(gè)臨時(shí)引用,創(chuàng)建臨時(shí)變量不會(huì)改變?cè)?類(lèi)型不匹配的話)P263
    • 實(shí)參類(lèi)型正確,但不是左值,比如常量
    • 實(shí)參類(lèi)型不正確,但可以轉(zhuǎn)換,比如一個(gè)long的范圍比較小,轉(zhuǎn)換為int,這種情況下一般需要加個(gè)const標(biāo)注以下,因?yàn)椴粫?huì)改變引用值
  • ==引用中的匿名變量==...就是上面的臨時(shí)變量
  • 可使用右值引用,使用&&
  • 如果不希望更改引用的值,使用const聲明原型
  • 當(dāng)函數(shù)返回值為引用,然后 a=fun(...),這樣避免fun返回值先創(chuàng)造一個(gè)局部變量,可以直接復(fù)制.函數(shù)返回引用實(shí)際就是返回引用變量的別名 .注意:返回的引用不應(yīng)該是個(gè)局部變量,就像指針一樣
  • 基類(lèi)的引用可以指向派生類(lèi)的對(duì)象,這也就是說(shuō)函數(shù)原型參數(shù)為基類(lèi),但你可以用派生類(lèi)的對(duì)象
  • cout.setf() 格式化輸出,返回的是所有配置,所以可以用返回值保存當(dāng)前的配置P273
  • 關(guān)于使用指針或者引用:類(lèi)使用引用,結(jié)構(gòu)使用引用和指針,其他使用指針
  • 默認(rèn)參數(shù)的右邊必須是默認(rèn)參數(shù),調(diào)用是不允許跳過(guò),比如fn(int a ,int b=1,int c=2),不能使用fn(1,,3),默認(rèn)參數(shù)一般放在原型而不是實(shí)際定義中
  • 函數(shù)重載中有些參數(shù)是不能共存的,比如 x 與 &x
  • 函數(shù)模版,也就是參數(shù)的類(lèi)型可以是尚未可知的,比如有一個(gè) fn(int a) 和 fn(double a),如果內(nèi)部執(zhí)行步驟一致,以前我們需要寫(xiě)兩個(gè)函數(shù),現(xiàn)在可以把這個(gè)提取出來(lái).
//下面都可以,class是老的
template <typename Anytype>//一般寫(xiě)作 template <typename T>
template <class Anytype>
void Swap(Antype &a, Anytype &b)
{
    Anytype temp;
    temp=b;
    b=a;
    a=temp;
}
  • 函數(shù)模板支持重載,與一般的重載函數(shù)一樣,特征標(biāo)需要不一樣
  • 模板的局限性:
    • 一些操作無(wú)法執(zhí)行,比如如果變量是個(gè)結(jié)構(gòu),那么運(yùn)算符>;如果是數(shù)組,那=就不成立,等等..
    • 解決辦法:1運(yùn)算符重載 2 具體化模板定義
  • 對(duì)于一個(gè)函數(shù)名,依次是非模板函數(shù)>顯示具體化模板>模板函數(shù) 包含他們的重載函數(shù)
  • 具體顯示化格式:原型和定義以template<>打頭,通過(guò)名稱(chēng)指出類(lèi)型,顯示化聲明后必須要有具體的定義
//模板
template<typename T>
void Swap(T &a, T &b);

struct job
{
    int a;
    int b;
}

//顯示化聲明,這里的Swap(Job)中的job是可選的,參數(shù)里面已經(jīng)有了
//可以簡(jiǎn)寫(xiě) template<> void Swap(job &j1, Job & j2);
template<> void Swap(Job)(job &j1, Job & j2);

//顯示化定義
template<> void Swap(Job)(job &j1, Job & j2)
{
    .....
}

  • 還可以在函數(shù)使用的時(shí)候創(chuàng)建顯示實(shí)例化cout<<Add(double)(x,m)<<endlP288

  • 具體到調(diào)用函數(shù)才會(huì)產(chǎn)生模板的實(shí)例,稱(chēng)為一個(gè)實(shí)例.C++支持

    • 隱式化實(shí)例
    • 顯示化實(shí)例,這種實(shí)例需要這么聲明template<> void Swap(Job)(job &j1, Job & j2),或者template<> void Swap(job &j1, Job & j2);,還支持函數(shù)中直接實(shí)例化例如cout<<Add(double)(x,m)<<endl
    • 顯示具體化是指針對(duì)特殊的一些結(jié)構(gòu),做出不同的實(shí)例化的函數(shù)
  • 顯示實(shí)例化話是模板的一個(gè)具體實(shí)例,因?yàn)槟0迳珊瘮?shù)一般是隱式實(shí)例化的,根據(jù)實(shí)參的類(lèi)型生成函數(shù)。而顯示實(shí)例化直接指定生成模板的哪一種實(shí)例。顯示具體化是指模板的特殊行為,理論上模板接受不同類(lèi)型的參數(shù)都會(huì)按照模板定義的那樣去執(zhí)行,顯示具體化允許在特定的形參下重新定義函數(shù)的行為。

  • 模板函數(shù)的選擇有一套復(fù)雜的規(guī)則,當(dāng)完全匹配后,選擇那個(gè)T最簡(jiǎn)單的方式

  • 模板是支持多個(gè)參數(shù)不定的template <class T1, class T2>

  • decltype 解決一些類(lèi)型未知不定的情況P295,配合auto可以聲明返回值的類(lèi)型,注意decltype 中如果表達(dá)式式個(gè)左值,有兩個(gè)括號(hào)的是引用,一個(gè)的是值的類(lèi)型

  • 所謂的特征標(biāo),就是函數(shù)的參數(shù)列表,翻譯想出的高大上的傻逼詞語(yǔ)

第九章

  • 多文件編譯,頭文件包含
  • 作用域表示這個(gè)東西在文件內(nèi)多大范圍可見(jiàn),鏈接性表示外部文件的共享
  • 靜態(tài)變量都會(huì)被先初始化,然后在初始化為其他值 bss
  • cv限定符...翻譯出來(lái)的新玩意..就是const和volatile
  • mutable,表示即使結(jié)構(gòu)或者類(lèi)變量為const,但是限定為mutable的某個(gè)變量也可以被修改
  • const 在c++中,會(huì)將全局變量限定為static,這么做的原因是可以將const int a =2這種形式放到.h中,反復(fù)包含.當(dāng)然也可以強(qiáng)制更改這個(gè)屬性,在const前加上extern .c中沒(méi)有這個(gè)說(shuō)法.

todo

==數(shù)組名取地址==

for里面的作用域

備忘:

  • (),[]優(yōu)先級(jí)高于指針
  • ++高于*,&指針優(yōu)先級(jí)
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,655評(píng)論 1 51
  • 基于基本類(lèi)型和浮點(diǎn)類(lèi)型創(chuàng)建(C語(yǔ)言:派生類(lèi)型) 1.數(shù)組(簡(jiǎn)介) 1.數(shù)組聲明 ·存儲(chǔ)在每個(gè)元素中的值的類(lèi)型 ·數(shù)...
    MelloCat閱讀 773評(píng)論 0 3
  • 1.C和C++的區(qū)別?C++的特性?面向?qū)ο缶幊痰暮锰帲?答:c++在c的基礎(chǔ)上增添類(lèi),C是一個(gè)結(jié)構(gòu)化語(yǔ)言,它的重...
    杰倫哎呦哎呦閱讀 9,984評(píng)論 0 45
  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識(shí)點(diǎn);socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme閱讀 20,418評(píng)論 0 50
  • 題目類(lèi)型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒(méi)有Protection行為...
    阿面a閱讀 7,885評(píng)論 0 10

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