1. 程式人生 > >學過c後的c++學習

學過c後的c++學習

該內容為我學習完c後學c++時所作的筆記,所以可能有點雜亂(~~~)
未完!
計算陣列的長度

sizeof()指出整個陣列的長度,strlen()是字串的長度,不包括空字元。

cin是istream的一個物件

cin.width(常);   //設定接下來輸出的長度,僅僅是接下的一次輸出。
cin>>變數;      //保留回車字元在輸入流中
cin.getline(字串陣列名,讀取的數量);   //將會車變成0讀入                                                              
cin.get(字串陣列名,讀取的數量);      //保留回車字元在輸入流中;

另一過載: cin.get(字元) //讀取一個字元。該方法返回一個cin物件,在需要時會轉換bool型別。如判斷輸入是夠合法時。
另一過載 :cin.get(無)  //會讀取下一個字元無論是什麼。該方法返回讀取的字元。

string類

可以通過“+”“=”來賦值,可以用cout和cin來對string進行輸入輸出。
string也可以和陣列那樣——s[0] 使用。

結構體初始化

和陣列一樣,用{······,······}
初始化結構體的初始值比成員少,餘下的成員將被初始化為0

原始字元(raw)

在原始字元中,字元表示的就是自己。\n不表示換行,而是“\”“n”兩個字元
    格式為:R“+(········)+”

new運算子與delete運算子

typeName *pointer_name = new typeName;
    如:int *p=new int ;
釋放new分配到記憶體:delete  pointer_name;
    如:delete p;
用new動態分配數字記憶體:
    typeName  *pointer_name = new  typeName [size(可以為常量也可以為變數)]
    如:int  *p=new int [a];
    delete釋放:delete  []  pointer_name; 
    如:delete []p 
    //注意  **[]**在前

使用new和delete規則: 來自c++ primer plus

1.不要使用delete來釋放不是new分配的記憶體。
2.不要使用delete釋放同一個記憶體塊兩次。
3.如果使用new為一個實體分配記憶體,則應使用 delete(沒有方括號)來釋放。
4.如果使用new [] 為數字分配記憶體,則應使用 delete [] 來釋放。
5.對空指標使用delete是安全的。

如果給cout提供一個指標,它將列印地址。但如果指標型別為char*型,則cout將顯示指向的字串。如果要顯示的是字串的地址,則必須將這種指標強制轉換為另一種指標型別。

strcpy()與strncpy(

strncpy有第三個引數接受要複製的最大字元數。
注意如果該函式在到達字串結尾之前,目標記憶體已經用完,則它將不會新增空字元,在最後應該手動新增,
如:陣列為a[10]則為a[9]='\0'; 。

模板類

vector:宣告:vector<typeName>vt(N);     
//建立一個名為vt的vector物件,它可以儲存N個型別的typeName的元素其中N可以是整形常量,也可以是整形變數。

array: 宣告:array<typeName,N>arr;     
//建立一個名為arr的array物件,它包含N個型別的typeName的元素其中N只能是是整形常量。

··在c++11中可將列表初始化用於vector和array物件(和初始化陣列一樣)。但在c++98中不能對vector物件這樣做。
··在宣告這兩種物件後,可用訪問陣列一樣訪問各個元素(將物件名看成陣列名)
··可以將一個array物件賦給另一個array物件。

檔案

包含fstream標頭檔案
建立ofstream(寫入檔案)或者ifstream(讀取檔案)物件
將物件與檔案關聯:物件.open("檔名")。讀取檔案時需注意若檔案不存在,則會開啟失敗的問題,所以應該新增判斷。用:物件.good();如果開啟檔案則返回ture;
像cout和cin一樣操作檔案。如:寫入檔案:while(cin.get(s)){物件<<s;}

如果要讀取空字元需要:物件>>noskipws

函式指標

宣告:double  (*pf)(int );//pf為指向一個返回值為double,引數傳遞了一個int的函式指標

也可以用c++11的自動型別推斷功能。auto 函式指標=函式名。
double  (*pf[n])(int );函式指標的陣列
auto不能宣告函式指標陣列,他只能用於單值初始化,不能用於列表初始化,但聲明瞭一個的時候,可以用  auto pb=pa;//pa為指向函式指標的指標。

行內函數宣告:原函式宣告上加上inline

引用

型別 & 引用名=被引用名(變數)。如:int & a=b;

在引用引數為const的條件下():(const int &a);
引用只能在宣告的時候初始化
引用與實參型別不匹配的時候將建立臨時變數,相當於是傳遞的值
引用與實參型別相同,但不為左值(字面常量:1,2;表示式)也會建立臨時變數


對於帶引數列表的方法(給傳入的引數設定預設值,若使用方法的時候,沒有傳入值,則使用預設值),必須從右向左新增預設值,也就是說,要為某個引數設定預設值,則必須為它右邊的所有引數提供預設值。//設定預設引數是在宣告的時候

函式模板

template <class T>          //或template <typename T>
    void swap_ture(T &a, T &b)
    {
        T temp;
        temp = a;
        a = b;
        b = temp;
    }

建構函式(沒有返回值)

初始化物件:類名 物件名 = 類名(也是建構函式名)(傳入的引數)或者 類名 物件名 (傳入的引數)
寫了建構函式就必須提供預設建構函式
如果建構函式使用了new,則應使用delete的解構函式。

作用域內列舉

enum class 列舉型別名 {one ,twe};
列舉型別名  列舉名=列舉型別名::one;

運算子過載
運算子左邊的呼叫物件,右邊為傳遞引數的物件。宣告為:在普通函式宣告條件下,將函式名改為 :operator 運算子

友元函式

將函式的宣告放在類中並在前加上friend。友元函式不是類的成員函式,不能通過成員運算子來呼叫,但它與成員函式的訪問許可權相同

提示

一定要在對指標應用解除引用運算子(*)之前。將指標初始化為一個確定的,適當的地址。
逗號運算子的優先順序是最低的
如果用cin出現非法輸入,則接下來的輸入將不會執行,且非法的內容將保留在快取區,若需繼續輸入需要用cin.clear()重置輸入
對陣列名取地址將返回整個陣列的地址
為了防止對標頭檔案進行了多重引用,可以用條件編譯
函式的過載不區分const(當const的屬性為是否能改變原來的值時)
只要類方法不修改呼叫物件,就應該將其宣告為const方法:在定義與聲明後加上const
析構函呼叫的問題:如果返回也是帶解構函式的類,它會呼叫一次該類的解構函式