C++初學者應該注意的問題

總體上必須清楚的:
  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++!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,532評論 1 51
  • C++文件 例:從文件income. in中讀入收入直到文件結束,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 2,826評論 0 3
  • 本文博客園地址:http://www.cnblogs.com/xiongxuanwen/p/4290086.htm...
    先之閱讀 854評論 0 5
  • 1.block 一對一的通信,不需要定義協議方法; 2.notification 一對多通信 ,通信對象間不需要建...
    一代驕馬閱讀 194評論 0 0
  • 時間過去久遠,關于本書,只想到給我留下印象最深的兩個字:賦能。 埃里克是一名可以在火人節中游刃有余的計算機科學家,...
    niuniuniu閱讀 453評論 0 0