總體上必須清楚的:
1)程序結(jié)構(gòu)是三種: 順序結(jié)構(gòu) , 循環(huán)結(jié)構(gòu)(三個(gè)循環(huán)結(jié)構(gòu)), 選擇結(jié)構(gòu)(if 和 switch)
2)讀程序都要從main()入口, 然后從最上面順序往下讀(碰到循環(huán)做循環(huán),碰到選擇做選擇)?! ?br>
3)計(jì)算機(jī)的數(shù)據(jù)在電腦中保存是以 二進(jìn)制的形式. 數(shù)據(jù)存放的位置就是 他的地址.
4)bit是位 是指為0 或者1。 byte 是指字節(jié), 一個(gè)字節(jié) = 八個(gè)位.
5)一定要記住 二進(jìn)制 如何劃成 十進(jìn)制。
概念??嫉降模骸 ?)編譯預(yù)處理不是C語言的一部分,不再運(yùn)行時(shí)間。C語言編譯的程序稱為源程序,它以ASCII數(shù)值存放在文本文件中。 2)每個(gè)C語言程序中main函數(shù)是有且只有一個(gè)。
3)在函數(shù)中不可以再定義函數(shù)?! ?br>
4)算法的是一定要有輸出的,他可以沒有輸入?! ?br>
5)break可用于循環(huán)結(jié)構(gòu)和switch語句?! ?br>
6)逗號(hào)運(yùn)算符的級(jí)別最低。
1)合法的用戶標(biāo)識(shí)符考查:
合法的要求是由字母,數(shù)字,下劃線組成。有其它元素就錯(cuò)了?! ?br>
并且第一個(gè)必須為字母或則是下劃線。第一個(gè)為數(shù)字就錯(cuò)了。
關(guān)鍵字不可以作為用戶標(biāo)識(shí)符號(hào)。
main define scanf printf 都不是關(guān)鍵字。
迷惑你的地方If是可以做為用戶標(biāo)識(shí)符。因?yàn)镮f中的第一個(gè)字母大寫了,所以不是關(guān)鍵字。
2)字符數(shù)據(jù)的合法形式: '1' 是字符占一個(gè)字節(jié),"1"是字符串占兩個(gè)字節(jié)(含有一個(gè)結(jié)束符號(hào))。 '0' 的ASCII數(shù)值表示為48,'a' 的ASCII數(shù)值是97,'A'的ASCII數(shù)值是65。
3) 整型一般是兩個(gè)字節(jié), 字符型是一個(gè)字節(jié),雙精度一般是4個(gè)字節(jié): 考試時(shí)候一般會(huì)說,在16位編譯系統(tǒng),或者是32位系統(tǒng)。碰到這種情況,不要去管,一樣做題。掌握整型一般是兩個(gè)字節(jié), 字符型是一個(gè)字節(jié),雙精度一般是4個(gè)字節(jié)就可以了。
4)強(qiáng)制類型轉(zhuǎn)換: 一定是 (int)a 不是 int(a),注意類型上一定有括號(hào)的?! ∽⒁猓╥nt)(a+b)和(int)a+b 的區(qū)別。 前是把a(bǔ)+b轉(zhuǎn)型,后是把a(bǔ)轉(zhuǎn)型再加b。
5)轉(zhuǎn)義字符的考查: 在程序中 int a = 0x6d,是把一個(gè)十六進(jìn)制的數(shù)給變量a 注意這里的0x必須存在?! ≡诔绦蛑?int a = 06d, 是一個(gè)八進(jìn)制的形式?! ≡谵D(zhuǎn)義字符中,’\x6d’ 才是合法的,0不能寫,并且x是小寫。 ‘\141’ 是合法的, 0是不能寫的?! 甛108’是非法的,因?yàn)椴豢梢猿霈F(xiàn)8。
容易犯的錯(cuò)誤
變量
內(nèi)置類型
1、在C++中,類型的定義基本和C語言的相同,只是有一些不同。在C++中,根據(jù)C++ Primer中所講,main()函數(shù)的返回類型必須是int型。這個(gè)沒有親自驗(yàn)證過,或者說曾經(jīng)遇到但是沒有注意。估計(jì)使用不同的編譯器結(jié)果是不一樣的吧,有些編譯器會(huì)對(duì)C++的標(biāo)準(zhǔn)進(jìn)行擴(kuò)展。而且空格符不允許出現(xiàn)在預(yù)處理指示中。
2、在內(nèi)置類型中遇到的第一個(gè)問題是bool類型到底占了多大的存儲(chǔ)空間。這個(gè)是C++標(biāo)準(zhǔn)未定義的,編譯器可以根據(jù)自己的想法規(guī)定bool類型所占據(jù)的存儲(chǔ)空間。
3、C++中有一種類型叫wchar_t,叫寬字符。是對(duì)char類型的擴(kuò)展,占有兩個(gè)字節(jié)的存儲(chǔ)空間。寬字符字符串表示為L"hello world".其中,連接字符串字面值和寬字符串字面值,其結(jié)果是未定義的,這樣的程序可能會(huì)執(zhí)行,崩潰或者產(chǎn)生沒有用的值,在不同的編譯器下程序的結(jié)果可能會(huì)不同。
4、C++中初始化有兩種方法:一種是直接初始化,如int val(1024);另一種是復(fù)制初始化,如int val=1024.
5、extern關(guān)鍵字表示聲明變量而不是定義變量。只有當(dāng)extern聲明位于函數(shù)外部時(shí),才可以含有初始化式。
6、局部變量可以屏蔽全局變量,而不是平常認(rèn)為的重復(fù)定義,只有在同一個(gè)作用域中的同名定義變量才會(huì)被編譯器認(rèn)為是重復(fù)定義。
7、非const變量定義在全局作用域中,如果做了合適的聲明,就可以在另外的文件中使用。即,在全局作用域定義非const變量時(shí),它可以在整個(gè)程序中訪問,方法是在一個(gè)文件中定義,在另一個(gè)文件中用extern聲明即可。而全局的const變量是定義該對(duì)象的文件的局部變量,中存在于那個(gè)文件中。不能被其他文件訪問,若指定其為extern就可以全部訪問了。這個(gè)在C++ primer中我感覺是一句廢話。其根源是非const變量默認(rèn)是extern的。const類型在定義時(shí)必須初始化。
8、引用必須用與該引用同類型的對(duì)象初始化。const引用時(shí)指向const對(duì)象的引用。非const引用只能綁定到與該引用同類型的對(duì)象;const引用則可以綁定到不同但相關(guān)的類型的對(duì)象或綁定到右值。如:
double dval=3.14;
const int &ri=dval;
編譯器會(huì)默認(rèn)將其轉(zhuǎn)換為:
int temp=dval;
const int &ri=temp;
9、若ri為非const,則修改ri只是改變了temp,而為改變dval.所以僅允許const引用綁定到需要臨時(shí)使用的值是完全必要的。頭文件中可以定義類,值在編譯時(shí)就可以知道的const對(duì)象和inline函數(shù)。當(dāng)const對(duì)象是由常量表達(dá)式初始化時(shí),要放在頭文件中;相反,要放在源文件中,并在其它文件中添加extern.
標(biāo)準(zhǔn)庫類型
1、迭代器iterator中,vector對(duì)象ivec.end(); 返回的是末端元素的下一個(gè)地址。
2、使用const_iterator類型時(shí),我們可以得到一個(gè)迭代器,它自身的值可以改變,但不能用來修改其指向的元素的值,可以對(duì)迭代器進(jìn)行自增一級(jí)使用解引用來讀取值,但不能對(duì)該元素進(jìn)行賦值。
3、const iterator只能用它來改寫指向的元素,不能使它指向其他元素,且必須進(jìn)行初始化。
4、任何改變vector長度的操作都會(huì)使已存在的迭代器失效。
數(shù)組和指針
1、在函數(shù)體外定義的數(shù)組,其元素均初始化為0;在函數(shù)體內(nèi)定義的內(nèi)置類型的數(shù)組,其元素?zé)o初始化。不管數(shù)組定義在哪里,如果其元素為類類型,則自動(dòng)調(diào)用該類的默認(rèn)構(gòu)造函數(shù)進(jìn)行初始化。數(shù)組是不允許直接復(fù)制和賦值的。
2、指針和引用的區(qū)別:①引用總是指向某個(gè)對(duì)象,定義引用時(shí)沒有初始化是錯(cuò)誤的。②給引用賦值時(shí)改變的是引用所關(guān)聯(lián)的對(duì)象的值,而不是使引用與另一個(gè)對(duì)象關(guān)聯(lián)。
3、不允許一個(gè)非const對(duì)象指針指向一個(gè)const對(duì)象。允許吧非const對(duì)象地址賦值給一個(gè)指向const對(duì)象的指針。
4、指向const對(duì)象的指針: const int p;.const 指針:int const p; //定義時(shí)必須初始化
5、釋放動(dòng)態(tài)申請(qǐng)的數(shù)組時(shí)要用delete[] p;不能只是delete p;這樣會(huì)造成內(nèi)存泄露。
6、typedef:
typedef String pstring;
const pstring cstr;==String * const pstring;
因?yàn)閏onst形容的是cstr,所以要放在它們中間。
表達(dá)式
1、求模的操作數(shù)只能為整數(shù)類型,如bool,char,short,int,long.如果兩個(gè)數(shù)都是負(fù)數(shù),求模的結(jié)果為負(fù)數(shù)或者零,如果一正一負(fù),則結(jié)果視機(jī)器或編譯器而定。
2、在一個(gè)表達(dá)式里,不要在兩個(gè)或更多的子表達(dá)式中對(duì)同一個(gè)對(duì)象做自增或自減操作。這樣的行為時(shí)未定義的。
3、對(duì)于包含signed和unsigned型的表達(dá)式,signed型會(huì)被轉(zhuǎn)換為unsigned型。
4、如果逗號(hào)操作符最右邊的操作數(shù)是左值,則逗號(hào)表達(dá)式的值也是左值。
函數(shù)
1、指針形參:若函數(shù)的形參是指向非const類型的指針,則傳遞的實(shí)參只能是指向非const類型的指針;若函數(shù)形參是指向const類型的指針,則傳遞指向const和非const類型的指針都可以。原因是:可以將指向const對(duì)象的指針初始化為指向非const對(duì)象,但不可以讓指向非const對(duì)象的指針指向const對(duì)象。
2、引用形參:如果函數(shù)有非const引用形參,則不能通過const對(duì)象進(jìn)行調(diào)用。
3、在調(diào)用函數(shù)時(shí),如果該函數(shù)使用非引用的非const形參,則既可以給函數(shù)傳遞const實(shí)參,也可以給函數(shù)傳遞非const的實(shí)參。原因是在C語言中,具有const形參或非const形參并無區(qū)別,都是實(shí)參的副本,這里主要是與C語言兼容。原因:實(shí)參傳遞時(shí)復(fù)制傳遞,可以用const對(duì)象初始化非const對(duì)象,反之亦然。
4、通過引用傳遞數(shù)組,編譯器會(huì)檢查數(shù)組實(shí)參大小與形參大小是否匹配。若直接傳遞數(shù)組,編譯器只是傳遞了指向數(shù)組第一個(gè)元素的指針,并不進(jìn)行數(shù)組大小的匹配。如:
void func(int (&arr)[10]);
傳遞多維數(shù)組方法:
void func(int (arr)[10]);
//或者
void func(int arr[][10]);
5、如果一個(gè)函數(shù)的形參具有默認(rèn)實(shí)參,那么,它后面所有的形參都必須具有默認(rèn)實(shí)參。要給一個(gè)帶默認(rèn)實(shí)參的形參提供實(shí)參,那么也必須給它前面的帶默認(rèn)實(shí)參的形參提供實(shí)參。在一個(gè)文件中,只能為一個(gè)形參指定默認(rèn)實(shí)參一次,一般在聲明中指定默認(rèn)實(shí)參。若在定義中的形參表中指定默認(rèn)實(shí)參,那么只有在包含該函數(shù)定義的源文件中調(diào)用該函數(shù)是,默認(rèn)實(shí)參才有效,所以說,默認(rèn)實(shí)參一般要定義在頭文件中。
6、編譯器隱式的將在類內(nèi)定義的成員函數(shù)當(dāng)做內(nèi)聯(lián)函數(shù)。
7、類中成員函數(shù)形參表后面的const表明this是指向const對(duì)象的指針,不能修改調(diào)用該函數(shù)的對(duì)象,這種函數(shù)叫const成員函數(shù)。
8、關(guān)于函數(shù)指針:
//①表示cmpFcn是一種指向函數(shù)的指針類型名字。
Typedef bool (cmpFcn)(const string&,const string&);
//② 函數(shù)指針不存在類型轉(zhuǎn)換。
//③ 調(diào)用函數(shù)指針的方法如:
//函數(shù)聲明為
bool lengthCompare(const String&,const String&);
cmpFcn pf=lengthcompare;
lengthCompare("hi","bye");//函數(shù)名直接調(diào)用
pf("hi","bye");//函數(shù)指針調(diào)用
?。?/em>pf) ("hi","bye");//函數(shù)解引用調(diào)用
//④函數(shù)指針型的形參:
void useBigger(bool(const String&,const String&));
void useBigger(bool()(const String&,const String&));
標(biāo)準(zhǔn)IO庫
1、IO對(duì)象不可復(fù)制或賦值。由于流對(duì)象不能復(fù)制,隨意不能存在vector容器中。形參或返回類型不能為流對(duì)象。必須傳遞或返回IO對(duì)象的指針或者引用。引用必須是非const類型的。
類
1、const成員不能改變其所操作的對(duì)象的數(shù)據(jù)成員。const必須同時(shí)出現(xiàn)在聲明和定義中,若只在定義或者聲明中出現(xiàn)一處,就會(huì)出現(xiàn)編譯錯(cuò)誤。
2、不能從const成員函數(shù)返回指向類對(duì)象的普通引用,const成員只能返回this作為一個(gè)const引用。
3、顯式指定inline成員時(shí),可以在類內(nèi)聲明時(shí)寫inline,也可在類外寫inline,但是只能二者選一。
4、因?yàn)轭惪梢韵蚯奥暶?,即只是聲明,如:class A;卻不定義類的成員,所以該類不能創(chuàng)建對(duì)象。但是可以定義該類的指針或者引用。這樣便可以定義一個(gè)class A{ public:A next;};類似C語言中鏈表所表示的結(jié)構(gòu)一樣。
5、使用類的方法有兩種:一種為A temp;另一種為class A temp;.這是為了和C語言的結(jié)構(gòu)體兼容。
6、const對(duì)象只能使用const成員。非const對(duì)象可以使用任意成員。
7、Mutable表示可變數(shù)據(jù)成員,甚至當(dāng)它是const對(duì)象也是如此。將數(shù)據(jù)成員前加上mutable關(guān)鍵字,const成員函數(shù)就可以改變該成員變量的值了。
8、成員函數(shù)形參表和函數(shù)體處于類作用域中,這兩個(gè)可以直接使用類內(nèi)定義的類型或者變量。函數(shù)的返回值類型不一定在類作用域中,與形參表相比,返回值類型出現(xiàn)在成員函數(shù)名字前面。如果函數(shù)定義在類定義體外,則用于返回值類型的名字在類作用域之外。如果返回值類型使用類定義的類型,則必須使用完全限定名。而形參表和成員函數(shù)體都出現(xiàn)在成員名之后,這些都是淚的作用域中定義,所以不用限定而使用其他成員。如:
class Screen{
public:
Typedef std::string::size_type index;
Index get_cursor() const;
private:
Int cursor;
};
Inline Screen::index Screen::get_cursor()const{
return cursor;
}
9、一旦一個(gè)名字被用作類型名,該名字就不能被重復(fù)定義。構(gòu)造函數(shù)不能聲明為const,因?yàn)檫@完全沒有意義,構(gòu)造函數(shù)的性質(zhì)就是要給數(shù)據(jù)成員進(jìn)行賦值的。
10、構(gòu)造函數(shù)可以用初始化列表或函數(shù)體內(nèi)賦值進(jìn)行初始化。但賦值并不是顯式的初始化,而是構(gòu)造函數(shù)執(zhí)行時(shí)先對(duì)數(shù)據(jù)成員進(jìn)行默認(rèn)初始化,然后再賦值覆蓋。從概念上講,可以認(rèn)為構(gòu)造函數(shù)分為兩個(gè)階段執(zhí)行:初始化階段;普通計(jì)算階段。計(jì)算階段由構(gòu)造函數(shù)函數(shù)體中的語句組成。不管數(shù)據(jù)成員是否在構(gòu)造函數(shù)初始化列表中顯式初始化,類類型的數(shù)據(jù)成員總是在初始化階段進(jìn)行初始化。初始化發(fā)生在計(jì)算階段之前。
11、根據(jù)上述規(guī)定,可以得出:有些成員必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化。對(duì)于這樣的成員,在構(gòu)造函數(shù)體重對(duì)它們初始化不起作用。沒有默認(rèn)構(gòu)造函數(shù)的類類型的成員,const或者引用類型成員必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化,而不能在構(gòu)造函數(shù)函數(shù)體中進(jìn)行賦值初始化。
12、數(shù)據(jù)成員初始化的順序和數(shù)據(jù)成員聲明的順序一致,而不是根據(jù)構(gòu)造函數(shù)的初始化列表的順序一致。
13、只要定義一個(gè)對(duì)象時(shí)沒用提供初始化式,就使用了該類的默認(rèn)構(gòu)造函數(shù)。如:A a;使用的是默認(rèn)構(gòu)造函數(shù),而A a(37);表示使用了其他構(gòu)造函數(shù)。
14、只有類沒有定義構(gòu)造函數(shù)時(shí),編譯器才會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)。
15、單個(gè)實(shí)參調(diào)用的構(gòu)造函數(shù)定義了從形參類型到該類類型的一個(gè)隱式轉(zhuǎn)換。如:
class Sales_item{
public:
sales_item(const std::string &book=""):isbn(book),unit(0),revenue(0.0){}
void same_isbn(Sales_item si);
};
//當(dāng)使用對(duì)象調(diào)用
Sales_item item;
Item.same_isbn("123556");
//就會(huì)調(diào)用sales_item的單形參的構(gòu)造函數(shù)實(shí)例化一個(gè)新對(duì)象,然后傳給same_isbn做實(shí)參。從而實(shí)現(xiàn)隱式轉(zhuǎn)換。若要避免隱式轉(zhuǎn)換,就要在構(gòu)造函數(shù)聲明前加上expl//icit,explicit用于類內(nèi)部的構(gòu)造函數(shù)聲明上,在類定義體外部不再重復(fù)。
16、友元只能出現(xiàn)在類定義的內(nèi)部。
17、當(dāng)我們在類外部定義static成員時(shí),無需重復(fù)指定static保留字,該保留字只出現(xiàn)在類定義體內(nèi)部聲明處。static成員函數(shù)不能被聲明為const,因?yàn)閏onst就是承諾不會(huì)修改該函數(shù)所屬對(duì)象的數(shù)據(jù)成員,但是static 不屬于任何對(duì)象,static不能聲明為虛函數(shù)。static成員可以通過作用域操作符,對(duì)象,引用或指向該類類型的對(duì)象的指針調(diào)用。
18、static成員函數(shù)沒有this形參,它可以直接訪問所屬類的static成員,但不能直接使用非static成員。
19、當(dāng)static成員在類外部定義時(shí),static只寫在類定義體內(nèi)部的聲明處。
20、static數(shù)據(jù)成員只能定義在類定義體外部,并且進(jìn)行初始化,static只能在聲明處標(biāo)識(shí)。因?yàn)槠胀〝?shù)據(jù)成員不能在類的定義體中初始化,但static成員定義時(shí)必須初始化,所以只能定義在定義體外部。
21、const static數(shù)據(jù)成員可以在類定義體內(nèi)部進(jìn)行初始化,但是數(shù)據(jù)成員必須在類定義體外部進(jìn)行定義。只是在類內(nèi)部初始化時(shí),數(shù)據(jù)成員的定義不再指定初始值。
22、static數(shù)據(jù)成員可以做默認(rèn)實(shí)參,其他數(shù)據(jù)成員不可以。
23、static數(shù)據(jù)成員的類型可以是該類成員所屬的類型,如:
class Bar{
public:
private:
static Bar men1;//ok
Bar * men2;//ok
Bar men3;//error
};
復(fù)制控制
1、若要禁止復(fù)制,必須聲明其復(fù)制構(gòu)造函數(shù)為private,若想友元和成員中的復(fù)制也禁止,就可以聲明但是不定義一個(gè)private的復(fù)制構(gòu)造函數(shù)。
2、如果沒有顯式定義復(fù)制構(gòu)造函數(shù)或者賦值操作符,編譯器通常會(huì)提供一個(gè)默認(rèn)的。
3、當(dāng)定義一個(gè)新對(duì)象,并用一個(gè)同類型的對(duì)象對(duì)他進(jìn)行初始化時(shí),將顯式使用復(fù)制構(gòu)造函數(shù);當(dāng)將該類型的對(duì)象傳遞給函數(shù)或從函數(shù)返回值返回該類型的對(duì)象時(shí),將隱式使用復(fù)制構(gòu)造函數(shù)。
4、使用未定義的成員的任何嘗試將導(dǎo)致鏈接錯(cuò)誤。
5、如果定義了復(fù)制構(gòu)造函數(shù),編譯器不會(huì)自動(dòng)生成默認(rèn)構(gòu)造函數(shù),所以要自己定義默認(rèn)構(gòu)造函數(shù)。
6、合成析構(gòu)函數(shù)并不刪除指針成員所指向的對(duì)象。
7、即使編寫了自己的析構(gòu)函數(shù),合成析構(gòu)函數(shù)仍然運(yùn)行。當(dāng)撤銷對(duì)象時(shí),先運(yùn)行自定義的析構(gòu)函數(shù),然后運(yùn)行合成析構(gòu)函數(shù)。
重載操作符
1、::,.,.,?:不可重載。
2、重載操作符必須具有一個(gè)類類型的操作數(shù)或枚舉類型。優(yōu)先級(jí)和結(jié)合性是固定的且不具備短路求值的特征。
3、除了函數(shù)調(diào)用操作符operator()之外,重載操作符時(shí)使用默認(rèn)實(shí)參是非法的。
4、操作符定義為非成員函數(shù)時(shí),通常必須將它們設(shè)置為所操作類的友元。為的是可以訪問類的私有成員。
5、=,(),[],->操作符必須定義為成員,將這些操作符定義為非成員函數(shù)將在編譯時(shí)標(biāo)記為錯(cuò)誤。而復(fù)合賦值操作符如+=通常定義為成員,但是定義為非成員,編譯時(shí)不會(huì)出錯(cuò)。改變對(duì)象狀態(tài)的操作符如自增操作符要定義為成員函數(shù)。算數(shù)的,相等的,關(guān)系操作符位操作符一般定義為普通函數(shù)。箭頭操作符必須定義為類的成員函數(shù),解引用操作符不要求定義成員。()調(diào)用操作符必須聲明為成員函數(shù),一個(gè)類可以定義多個(gè)調(diào)用操作符版本。定義了調(diào)用操作符的類,其對(duì)象稱為函數(shù)對(duì)象。即它的行為是類似函數(shù)的對(duì)象。
6、為了與內(nèi)置類型保持一致,加法返回一個(gè)右值,而不是一個(gè)引用。
7、類定義下標(biāo)操作符時(shí),一般需要定義兩個(gè)版本:一個(gè)為非const成員并返回引用;一個(gè)味const成員并返回const引用。
8、前綴操作符:A& operator++();.后綴操作符:A& operator++(int);int形參只是一個(gè)標(biāo)識(shí),沒有實(shí)際用途。
9、轉(zhuǎn)換操作符 operator type();type表示內(nèi)置類型名,類類型名,由類型別名定義的名字。對(duì)任何可作為函數(shù)返回類型的類型(除了void外)都可以定義轉(zhuǎn)換函數(shù)。不允許轉(zhuǎn)換為數(shù)組類型或函數(shù)類型。轉(zhuǎn)化為指針類型(數(shù)據(jù)或函數(shù)指針)以及引用類型時(shí)可以的。轉(zhuǎn)換操作符函數(shù)必須是成員函數(shù),不能指定返回類型,形參表為空。
10、只能用一個(gè)類類型轉(zhuǎn)換,即,定義a能轉(zhuǎn)換為b,b能轉(zhuǎn)換為c,但a不能轉(zhuǎn)換為b再轉(zhuǎn)換為c.
學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,可以加我qq
1795495547,我們一起學(xué)C/C++!