1. 程式人生 > >C++常用知識點彙總(基礎)

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檢視。暫時整理這些,隨時更新。