【語言基礎】c++ 備忘錄

1. C++ 整數類型範圍ios

能夠參照頭文件limits.h定義的宏c++

#define INT_MAX       214748364732bit, 最大10位十進制)程序員

#define UINT_MAX      4294967295U32bit, 最大10位十進制)express

#define LLONG_MAX    9223372036854775807LL64bit, 最大19位十進制)數組

#define ULONG_MAX    18446744073709551615UL64bit, 最大20位十進制)安全

2. 防止頭文件被包含屢次app

頭文件中每每這樣寫函數

#ifndef  HEADERFILENAME_Hspa

#define HEADERFILENAME_H設計

....your code

#endif

3.變量是這樣聲明的

extern int e; 咱們通常不會extern int e=1; 由於這樣就算是直接定義了e,不必了;同一個做用域能夠聲明屢次,但只能定義一次。

4.string 的通常用法

string s1,s2("string"),s3(s2),s4(5,'c'),s5(s2.being(),s2.end());

char* cp = 「string」;

char c_array[] = 「string」;

char sb [] = {‘s’,’b’};//無結尾字符數組

string s6(cp), s7(c_array), s8(c_array,c_array+1);

string s9(sb);//runtime error

if(s1.empty()){

 string::size_type size = s1.size();

 cout<<size<<endl;

}

cout<<s1<<","<<s2<<","<<s3<<","<<s4<<endl;

ifstream fin("a");

while(getline(fin,s1)){

 cout<<s1<<endl;

}

fin.close();

s1 = s2;// first free s1's memory, second new a memory for s1, third copy data from s2 to s1.

s1 += s2;

s1 += "...";

//一些方法

<cctype>包含了不少字符操做方法

c_str(); 返回const char*

Insert,assign//替換,erase,substr(pos,n),find,append,replace

Rfing//最後一次出現的位置,find_first_of(args)//args中任意字符第一次出現的位置,find_last_of(args)//args中任意字符最後一次出現的位置,find_first_not_of(args)//對象中第一個不屬於args的字符,find_last_not_of(args)//對象中最後一個不屬於args的字符。

Compare

5. 指向常量的指針和常指針

const int * p = π//常量的指針,不能經過p改變pi的值。Pi能夠是常量或者是變量。

Int * const p = π//常指針

6. 數組初始化

Char a[5] = {0}; 一個定長空串,全是\0

Int a[3] = {1}; 其他會初始化爲0

Int a[2][3]={{1,2,3},{2},{1,2}};//按行初始化,每行其他是0

Int a[2][3]={1,2,3,4,5};//所有按地址順序初始化,其他是0

7. 函數指針

bool (*pf)(const string &); //定義一個參數爲一個常字符串引用返回類型爲bool類型的函數指針。

typedef bool (*pf)(const string &); //pf 能夠定義函數指針

若是定義了bool myfun(const string &); 

那麼咱們能夠這樣獲取函數地址:

pf test = myfun;或者pf test = &myfun;

8. 返回引用

返回引用能夠避免一些對象的拷貝,節約內存以及開闢內存的時間。固然返回引用也有其特別的地方,就是有時候能夠作左值:

char &get_val(string &s, string::size_type x){

return s[x];

}

那麼你能夠這樣調用他:

string s=」1234」;

get_val(s,0) = ‘a’;//s的值爲」a234」

若是不想讓其成爲左值,那麼參數要聲明爲「const string & s

注意:不要返回臨時對象的引用和指針!

9. 靜態變量是被自動初始化的

 

10. for循環定義的迭代變量是局部的

 

for(int i=0;i<2;i++){

 

   for(int i=0;i<2;i++){

 

       cout<<i;

 

   }    

 

}

 

0101

 11. palcement new 的使用

palcement new之因此有好處是由於他能夠把對象放在一片指定的內存之中,若是這個對象建立刪除比較頻繁他會比普通的new有很大優點。普通的new須要從新尋找一片足夠大的連續內存才行。

  1. #include <iostream>  
  2. #include <new>  
  3. using namespace std;  
  4. const int chunk = 16;  
  5. class Foo  
  6. {  
  7. public:  
  8.     int val( ) { return _val; }  
  9.     Foo( ) { _val = 0; }  
  10. private:  
  11.     int _val;  
  12. };  
  13. //預分配內存,但沒有Foo對象  
  14. char*buf = new charsizeof(Foo) * chunk ];  
  15. int main()  
  16. {  
  17.     //在buf中建立一個Foo對象  
  18.     Foo*pb = new (buf) Foo;  
  19.   
  20.     //檢查一個對象是否被放在buf中  
  21.     if ( pb->val() == 0 )  
  22.     {  
  23.         cout <<"new expression worked!" <<endl;  
  24.     }  
  25.     //到這裏不能再使用pb  
  26.     delete[] buf;  
  27.     return 0;  
  28. }  

12 c++方法隱藏

隱藏就是說方法看不到了,這種狀況出如今子類實現了與父類同名的函數(參數不一樣也能夠)。看下面的例子:

class Sup{
public:
virtual int test() {cout << "super" << endl;}
};
class Sub: public Sup{
public:
int test(int i) {cout << "sub:int"<< endl;}
int test(double i) {cout << "sub:double" << endl;}
};
int main(){
Sub s;
s.test();
}

這樣編譯不會經過,緣由以下:c++在設計時出於安全考慮,他認爲實現子類的人有可能不知道父類的方法,由於在調用的時候會調用匹配度最高的方法,因此在調用d.test()時極可能是程序員寫錯了而無心間調用了父類方法,這樣錯誤很難排查,因此乾脆吧父類同名方法隱藏。因此在編譯時會報錯,d找不到相應的方法。

若是你非要用Base裏面的方法,能夠顯示的在子類加上一句

class Sub:public Sup{
public:
int test(int i) {cout <<"sub:int" <<endl;}
int test(double i) {cout <<"sub:double" <<endl;}
using Sup::test;
};

(持續更新中....)

相關文章
相關標籤/搜索