C++知識點複習(一)
千里之行始於足下,打牢基礎是非常重要的,在對c和c++的知識學習了一段時間後,有些知識點的概念和特性也
不大熟悉了,所以自己準備將C++的知識點從頭到尾仔細的複習一遍,理一理:
(1)C++的三大特點:
a. 封裝:封裝可以隱藏實現細節,使得程式碼模組化。封裝是把過程和資料包圍起來,對資料的訪問只能通過已
定義的介面。面向物件計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通
過一個受保護的介面訪問其他物件。在面向物件程式設計上可理解為:把客觀事物封裝成抽象的類,並且類可以把自己的
資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。
b. 繼承:繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些
功能進行擴充套件。其繼承的過程,就是從一般到特殊的過程。通過繼承建立的新類稱為“子類”或“派生類”。被繼承的類
稱為“基類”、“父類”或“超類”。要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。在某些
OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通
過多級繼承來實現。
c. 多型:多型性(polymorphisn)是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之
後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的
指標賦值給父類型別的指標。
(2)繼承的實現方式:
a. 實現繼承:指使用基類的屬性和方法而無需額外編碼的能力;
b. 介面繼承:指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;
c. 可視繼承:指子窗體(類)使用基窗體(類)的外觀和實現程式碼的能力;
(3)建構函式:
名字和類名相同,沒有返回值,也不需要顯式呼叫,在建立物件的時候自動執行,專門用來初始化物件的;
(4)訪問許可權:
在類的內部,無論public,protect,private都可以互相訪問,沒有限制;在類的外部,只能是通過物件訪問public
的成員,不能訪問private,protected成員;通過類的內部public的函式訪問private;
(5)解構函式:
創造物件時用建構函式初始化;退出的時候用解構函式來退出,進行清理工作;釋放分配的記憶體,關閉開啟的文
件。Demo()----構造,~Demo()----解構函式 ;建構函式可以過載,解構函式只能一個,不能過載,析構沒有參
數;
(6)const:
a. 在c++中和#define的作用差不多,在c中修飾的變數不允許改變,但是可以通過指標修改該單元內容,輸出的時
候是修改後的內容;在c++中,雖然通過指標修改,但是輸出仍然是原來的內容,輸出不到記憶體取值;
b. c++中const的變數只能在本檔案中可用,別的檔案報錯,而c沒有這種限制;
(7)static:
a. 修飾區域性變數:靜態區域性變數,執行完釋放,初始化一次,
b. 修飾全域性變數:只能在本檔案中使用;
c. 修飾函式:只能在本檔案使用
(8)this指標:
指向當前物件,通過它可以訪問當前物件的所有成員。當前物件就是正在使用的物件;在類的內部使用,可以訪
問所有的成員,public,private,protect。this只能在非靜態成員函式內部使用,在其他地方非法;this 只能在物件創
建以後才能使用,否則非法;
(9)static成員變數:
static變數屬於類,只能在類外部初始化;static變數是幾個物件共享使用,相當於全域性變數;
外部初始化的格式:
int Student::m_total = 0;
型別 類名::static變數 = 數值;
static 成員的訪問形式:
a. 類名::static變數 : Student::m_total
b. 物件.(static 變數) : stu.m_total
c. 物件指標->(static成員變數) : pstr->m_total
(10)static函式:
沒有this指標,只能訪問static成員;
static函式宣告時加static,定義的時候不加;
(11)const成員函式:
可以使用所有的成員,但是不能改變值,宣告和定義函式時都要加const;
const物件只能呼叫類的const成員 ;
(12)友元函式friend:
在類外定義的,不屬於當前類的函式,可以在當前類中宣告,前面加friend,構成友元函式;
class Address
{
public:
friend class Student;
};
友員函式可以訪問當前類的private成員;
友元函式不能直接訪問類的成員,必須藉助物件;
友員的關係是單向的,不是雙向的;
友員關係不能傳遞:B是A的友員,C是B 友員, C和A之間不是友員關係;(13)string類:
a. 包含標頭檔案 <string>
string s1; 定義的時候沒有初始化,預設是空;
string s2 = "c plus"; 定義並初始化 c plus ,沒有‘\0’;
string s3 = s2; 定義s3,並把s2賦值給s3;
string s4 (3, 's'); 初始化為3個s;
string 輸入時,cin是遇到空格預設結束;
string成員可以用下標訪問;從0開始;
b. string 中字串可以使用+, +=進行字串的拼接;
c. string插入操作,insert
原型: string& insert(size_t pos, const string &str)
d. string刪除操作:erase
原型:string& erase(size_t pos = 0, size_t length)
s2.erase(5);把s2第5個元素後面的內容全部刪除;
s3.erase(5, 3);s3中第5個後面3個元素刪除
e. string中substr
string substr (size_t pos = 0, size_t len = npos) const;
pos 為要提取的子字串的起始下標,len 為要提取的子字串的長度。
s2 = s1.substr(3, 10);從第3個開始提取10給s2;
f. string查詢find查找出現的位置:
其中的兩種原型為:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
(14)繼承的方式:
a. public繼承:
基類中public成員在派生類中還是public屬性;
基類中protected成員在派生類中protected屬性;
基類中private在派生類中不能使用;
b. protected繼承
基類中public成員在派生類中為protected屬性;
基類中protected成員在派生類中為protected屬性;
基類中private在派生類中不能使用;
c. private繼承
基類中public成員在派生類中為private屬性;
基類中protected成員在派生類中為private屬性;
基類中private在派生類中不能使用;
在派生類中訪問基類的private成員的唯一方法就是藉助基類的非private成員函式,如果沒有這樣的成員函式則
無法訪問;
(15)改變訪問許可權using:
使用using改變基類成員在派生類中的訪問許可權;
如: public改成private,
存在問題: 在派生類中無法訪問基類中private成員,如何用using修改,編譯的時候報錯;