學過c後的c++學習
阿新 • • 發佈:2018-11-12
該內容為我學習完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
析構函呼叫的問題:如果返回也是帶解構函式的類,它會呼叫一次該類的解構函式