研究生期間做研究一直用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查看。暫時整理這些,隨時更新。