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