C++常用知識點彙總(基礎)

研究生期間做研究一直用Python,下學期面臨找工作壓力,這幾天抽時間複習了一下C++,簡單做了一下筆記,以備不時之需。

函數

  • 函數模板
    只適用於函數體相同、函數的參數個數相同而類型不同的情況,如果參數的個數不同,則不能用函數模板
  • 函數重載
    參數的個數和類型可以都不相同。但不能只有函數的類型不同而參數的個數和類型相同。
  • 默認參數
    實參與形參的結合是從左至右順序進行的。因此指定默認值的參數必須放在形參表列中的最右端,否則出錯。
  • 函數的聲明和定義
    函數的聲明是函數的原型,而函數的定義是函數功能的確立;
  • 變量的聲明和定義
    把建立存儲空間的聲明稱爲定義,把不需要建立存儲空間的聲明稱爲聲明;

指針和數組

  • 多維數組名作函數參數
    必須指定第二維(即列)的大小,且應與實參的第二維的大小相同
  • 變量與指針
    變量的指針就是變量的地址。用來存放變量地址的變量就是指針變量。
  • 指針變量
    一般的C++編譯系統都爲指針變量分配4個字節的存儲單元。但在定義指針變量時必須指定基類型。
  • 函數調用
    實參變量和形參變量之間的數據傳遞是單向的“值傳遞”方式,調用函數時不會改變實參指針變量的值,但可以改變實參指針變量所指向變量的值。
  • *(p++)、*(++p):
    前者先取*p的值,然後使p加1。後者是先使p加1,再取*p
  • 函數指針
    一個函數在編譯時被分配一個入口地址,這個函數入口地址就成爲函數的指針。
  • 指針函數
    返回指針值的函數,eg. 類型名 *函數名(參數列表)
指針數組    類型名 *數組名[數組長度]
數組指針    類型名 (*指針名)[數組長度]
  • 引用
    引用不是一種獨立的數據類型,必須指定其代表某一類型的實體(如變量、類對象),不能定義引用數組,不能定義指向引用的指針。引用變量主要用作函數參數,它可以提高效率,而且保持程序良好的可讀性。

結構體和對象

  • 動態分配撤銷內存
    new和 delete是運算符,不是函數
  • 類類型訪問限制
    如果在類的定義中既不指定private,也不指定public,則系統就默認爲是私有的。
  • 結構體vs類
    用struct聲明的類,如果對其成員不作private或public的聲明,系統將其默認爲public,而用class聲明的類,如果不作private或public的聲明,系統將其成員默認爲private。
  • 成員函數
    不論成員函數在類內定義還是在類外定義,成員函數的代碼段都用同一種方式存儲,即都不佔用對象的存儲空間。
  • 信息隱蔽
    類的公用接口與私有實現的分離。當接口與實現(對數據的操作)分離時,只要類的接口沒有改變,對私有實現的修改就不會影響程序的其他部分。
  • 默認構造函數:
    調用構造函數時不必給出實參的構造函數。一個類只能有一個默認構造函數。由於不需要實參也可以調用構造函數,因此全部參數都制定了默認值的構造函數也屬於默認構造函數。
  • 析構函數
    作用不是刪除對象,是在撤銷對象佔用的內存之前完成一些清理工作,由於沒有函數參數,所以不可以被重載。
  • 構造函數、析構函數執行順序
    先構造的後析構,後構造的先析構。相當於一個棧,先進後出。
  • 靜態數據成員
    在內存中只佔一份空間,每個對象都可以引用這個靜態數據成員。靜態數據成員在程序編譯時被分配空間,到程序結束時才釋放空間。
  • 靜態成員函數/非靜態成員函數
    非靜態成員函數有this指針,而靜態成員函數沒有this指針。靜態成員函數主要用來訪問靜態數據成員。
  • 提前引用聲明
    在正式聲明一個類之前,先聲明一個類名,表示此類稍後聲明。目的爲了解決“雞生蛋,蛋生雞”的問題。
  • 保護成員/私有成員:
    兩者的不同之處,在於把保護成員的訪問範圍擴展到派生類中。

運算符

  • 自增/減運算符重載函數
    如果在自增(自減)運算符重載函數中,增加一個int型形參,就是後置自增(自減)運算符函數。
  • 轉換構造函數/類型轉換函數
    在需要的時候,編譯系統會自動調用這些函數,建立一個無名的臨時對象。將運算符“+”函數重載爲友元函數,在進行對象相加時,可以用交換律。將運算符“+”函數重載爲類的成員函數,交換律不適用。所以,雙目運算符函數重載爲友元函數,單目運算符則多重載爲成員函數。
  • 運算符重載
    一般將單目運算符重載爲成員函數,將雙目運算符重載爲友元函數(原因如上一條)

繼承和多態

  • 派生類和基類
    派生類是基類的具體化,基類是派生類的抽象;一個派生類可以從一個基類派生,也可以從多個基類派生。構造派生類通常包含三部分:從基類接受成員,調整從基類接受的成員,在聲明派生類時增加的成員。構造函數和析構函數不能從基類繼承。
  • 重名函數覆蓋
    不同的成員函數,只有在函數名和參數個數相同、類型相匹配的情況下才發生同名覆蓋,如果只有函數名相同而參數不同,不會發生同名覆蓋,而屬於函數重載。
  • 虛基類繼承
    由於虛基類在派生類中只有一份數據成員,所以這份數據成員的初始化必須由派生類直接給出。
    基類和派生類之間的轉換:
    只能用子類對象對其基類對象賦值,而不能用基類對象對其子類對象賦值。通過指向基類對象的指針,只能訪問派生類中的基類成員,不能訪問派生類增加的成員。
  • 多態(polymorphism)
    具有不同功能的函數可以用同一個函數名
  • 虛函數
    允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數。在基類用virtual聲明成員函數時爲虛函數,在類外定義虛函數時,無需再加virtual。當一個成員函數被聲明爲虛函數後,其派生類中的同名函數都自動成爲虛函數。
  • 純虛函數
    在聲明虛函數時被初始化爲0的函數,作用是在基類中爲其派生類保留一個函數的名字,以便派生類根據需要對它進行定義。如果在基類中沒有保留函數名字,就無法實現多態性。
  • cerr/clog
    都是在終端顯示器上顯示出錯信息,但是cerr是不經過緩衝區,直接向顯示器輸出相關信息,clog中的信息是存放在緩衝區中,緩衝區滿後或遇到endl時向顯示器輸出。

C++工具

  • 異常檢測
    Catch塊是try-catch結構中的一部分,必須緊跟在try塊之後,不能單獨使用,兩者之間不能插入其他語句。

指向常量的指針vs常量指針

  • const出現在*左邊,表述被指物是常量,const出現在*右邊,表示指針是常量。如果出現在*兩遍,表示被指物和指針兩者都是常量

最新的C++特性,登錄boost查看。暫時整理這些,隨時更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章