現代c++應盡量使用vector和迭代器型別,避免使用低階的陣列和指標。設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。
與vector型別相比,陣列的顯著缺陷在於l陣列的長度是固定的,而程式設計師無法知道乙個給定陣列的長度,陣列沒有獲得其容量大小的size操作,也不提供push_back操作在其中新增元素,
現在c++程式則更多的使用vector取代陣列與程式內部使用,只有當效能測試表明使用vector無法達到必要的速度要求時,才使用陣列,
包括整型,字面值常量。列舉常量,非const變數以及到執行階段才知道其值的const變數都不能用於定義陣列的維數。
沒有所有的元素都是引用的陣列。
在函式外定義的內建陣列其元素均初始化為0;
在函式內定義的內建陣列其元素無初始化。
應避免使用未初始化的指標。
對指標進行初始化或複製只能使用以下四種型別的值:
1) 0值常量表示式。
2) 型別匹配的物件的位址。
4) 同型別的另乙個有效指標。
void指標:
c++提供了一種特殊型別void*。它可以儲存任何型別物件的位址。
void指標值支援集中有限的操作:
1) 與另乙個指標進行比較
2) 向函式傳遞void*指標或從函式返回void*指標
3) 給另乙個void指標賦值
4) 不允許使用void指標操縱它所指向的物件,
指標與引用的比較:
1) 引用總指向某乙個物件:定義引用時沒有初始化時錯誤的
2) 賦值行為的差異:給引用賦值修改的時該引用所關聯的物件的值而不是是引用於另乙個物件關聯。應用一經初始化指向同乙個特定的物件。
指標本身就是一種迭代器。
const double *cptr;//cptr是乙個指標,它指向double型別const物件。
double *const cptr// cptr是乙個const指標。它指向double型別物件。
typedef string *pstring;
const pstring cstr;
很多人認為是:const string *cstr;
這是錯誤原因是:宣告const pstring 時,const修飾的是pstring型別,這是乙個指標。
所以const修飾的是指標。所以應該是:string *const cstr;
盡可能的使用c++標準庫型別string,不必擔心字元陣列的大小問題。
對大部分的應用而言,使用標準庫縲紲string,除了增強安全性以外,效率也提高了。
動態分配陣列:
int *pt = new int[10];
也可以初始化動態分配陣列
int *pt = new int[0]();//對於動態分配的陣列,其元素只能初始化為元素型別的預設值,而不能像陣列變數一樣,用初始化列表為陣列元素提供各不相同初值。
允許動態分配空陣列:
雖然陣列長度是固定的,但動態分配陣列不必在編譯時知道其長度,可以(通常也是)在執行時才確定陣列長度。(一般陣列在編譯時必須知道其長度)
例如:int n=getsize(); int *p=new int[n]; for(int *q=p;q!=p+n;++q)
動態空間的釋放:delete p;//中間的不能去掉,它表示釋放的是自由儲存區中的陣列,而並非單個物件。
標準庫bitset型別(也是一種類模板)
在定義bitset是,要明確bitset含有多少位,需在尖括號內給出它的長度值;
bitset<32> betvec;//32bit,all zero;
給出的長度值必須是常量表示式,另,和vector一樣bitset中的為是沒有命名的,程式設計師只能按位置來訪問他們。危機的位置編號從0開始,因此,bitset的為序是從0到31;以0位開始的位串是低階位,以31位結束的位串是高階位;
初始化bitset物件的方法:
bitsetb;//b有n位,每位都為0;
bitsetb(u);//b是unsignedlong型u的乙個副本
bitsetb(s);//b是string型的s中含有的洧川的副本。
bitsetb(s,pos,n);//b是s中從位置pos開始的n個位的副本。
當用unsigned long值作為bitset物件初始化值時,該值將轉化為二進位制的位模式。如果bitset型別長度大於unsigned long值的二進位制位數,則其餘的高階位將置為0;如果小於只用低階位,超過的被丟棄。
bitset<16> bitvec(0xffff);//由於bitvec小於unsignedlong所以高階位別丟棄;
bitset<32> bitvec(0xffff);
bitset<64> bitvec(0xffff);//高階位填充為0;
0-15都是1;
當string物件初始化bitset物件時,string物件直接表示為位模式,從string物件讀入危機的順序是從右向左。
string str(「1100」);
bitset<32> bitvec(str);//第2,3的位置為1,其餘為0;如果物件的字元個數小於bitset型別的長度,則高階位將置為0;
string物件和bitset物件之間是反向轉化的,string物件的最右邊字元下標最大,用來初始化bitset的最低位,正好相反。記住這一差別。
還可以這樣:
string str(「1111111000000000」);
bitset<32> bitvec(str,5,4);//從str[5]開始,賦值4位;
bitset<32> bitvec(str,str.size(),-4);//用最後4位。
bitset上的操作:
b.any();//b中是否存在1;
b.none();//b中不存在1嗎
b.count();//b中1的個數
b.size();//中二進位制位的個數
b[pos];//訪問b中pos處的二進位制位
b.test(pos);//pos處的二進位制位是否為1
b.set();//吧b中的二進位制位全置為1
b.set(pos);//將pos處的二進位制位置為1
b.reset();//重置0
b.reset(pos);//將pos處置為0
b.flip();//將b所有二進位制位取反
b.flip(pos);//將pos處取反
b.to_ulong();//將b轉化為unsignedlong 型別
os《可以用輸出操作符輸出bitset物件中位模式。
bitset<32> bitvec(0xffff);
cout<<」bitset:」《輸出結果:0000000000000000011111111111111111
自增和自減:
有使用過c語言背景的讀者可能會覺得奇快,為什麼要在程式中使用前自增操作,道理很簡單:因為前置操作需要做的工作更少只需加1後返回加1後的結果即可,而後置操作必須先儲存運算元原來的值,以便返回未加
1之前的值作為操作的結果。
後置操作符返回為加1的值:當我們希望在單個復合表示式中使用變數的當前值,然後再加1時,通常使用後置操作。
例如:vector::iterator iter=ivec.begin();
while(iter!=ivec.end())
cout<<*iter++;
複習 暑假篇
也不知道還能再寫幾篇關於學校學習的文章,可是又明確的知道,只剩下一年了,如果算上寒假,外加上這一篇文章,關於期末複習也就只有兩篇可以寫了,因為畢業那個暑假顯然我不會寫。久違了的圖書館,一直都習慣了沒有信念學習下去的時候就看看自己寫過的部落格給自己一些安慰,說我還可以做的這麼好,寫出來這麼多的東西,所...
C 複習筆記(3)
static void main string args while guess number console.writeline you are correct and it only took you guesses guesses ps 如果應用程式在乙個較快的計算機上執行,則該計算機的系統時...
C語言複習3
一,指標。1.指向函式的指標。可以定義乙個指向函式的指標變數,用來存放某一函式的起始位址,這意味著此指標變數指向該函式。例如 int p int int 定義p是乙個指向函式的指標變數,它可以指向函式型別為整型且有兩個整型引數的函式。此時,指標變數p的型別用int int int 表示。舉個例子 i...