C++面向物件筆記丨類、派生、繼承、多型(複習連更中)
阿新 • • 發佈:2020-12-20
概述
複習材料:
- 教材,
- 部落格包含但不限於Haorical,阿騰木,眼裡有光~,Theoyu²,查又恩,野渡書生等各位大佬
- Today WA,tomorrow AC.
- Study smart not hard.
結合小題理解
- 不能被派生的函式有建構函式,解構函式,友元函式。
- 建構函式不能被宣告為虛擬函式,解構函式可以被宣告為虛擬函式(虛擬函式的引數型別,順序,個數必須一樣)
- 建構函式可以被過載,解構函式不可以被過載。
- 很多的const(填坑)
常資料成員
- 建構函式對常資料成員進行初始化時只能通過初始化列表進行
- 常資料成員在定義時必須初始化
- 如果類有多個預設建構函式必須都初始化常資料成員
常成員函式 - 只能呼叫常成員函式和常資料成員。
- 常成員函式可以被其他成員函式呼叫,但是不能呼叫其他非常成員函式
- 例如:已知
const A a
, 其中A是一個類名,指向常物件指標的表示為const A *pa
- 多型呼叫是指藉助於指向物件的基類指標或引用呼叫一個虛擬函式(以任何方式錯,純虛函錯)
- 派生類建構函式的成員初始化列表中,能包含基類的建構函式、派生類中子物件的初始化、派生類中一般資料成員的初始化,但是,不能包含基類中子物件的初始化
- 虛擬函式具有繼承性,是一個成員函式,靜態成員函式不可以說明為虛擬函式
- 必須使用引數初始化表的三種情況
- 需要初始化的資料成員是物件的情況(這裡包含了繼承情況下,通過顯示呼叫父類的建構函式對父類資料成員進行初始化);
- 需要初始化const修飾的類成員或初始化引用成員資料;
- 子類初始化父類的私有成員;(有無示例)
結合大題程式碼理解
Shape類(派生、虛擬函式、類物件、類指標)
定義一個Shape基類,在此基礎上派生出Rectangle
和Circle
類,二者都有GetArea()
函式計算物件的面積,使用Rectangle
類建立一個派生類Square
。
程式碼
class Shape { public: Shape(){} ~Shape(){} virtual float GetArea() {return -1;}}; //virtual函式 class Circle :public Shape { private: float r; public: Circle(float rr):r(rr){} float GetArea(){return (3.14*r*r);}}; //寫成 virtual float GetArea()也可以 class Rectangle:public Shape { protected: float l,h; public: Rectangle(float ll,float hh):l(ll),h(hh){} float GetArea(){return (l*h);}}; //寫成 virtual float GetArea()也可以 class Square: public Rectangle { public: Square(float ss):Rectangle(ss,ss){} float GetArea(){return (h*l);}}; //寫成 virtual float GetArea()也可以 int main() { Shape *sp; //類指標 int radium,length,hight,side; cin>>radium>>length>>hight>>side; sp=new Circle(radium); cout<<"The area of the circle is "<<sp->GetArea()<<endl; sp=new Rectangle(length,hight); cout<<"The area of the rectangle is "<<sp->GetArea()<<endl; sp=new Square(side); cout<<"The area of the Square is "<<sp->GetArea()<<endl; delete sp; return 0; }
分析
定義類物件:Student a;在定義之後就已經為a這個物件分配了記憶體,且為記憶體棧;
定義類指標:Student *b = new Student();在定義*b的時候並沒有分配記憶體,只有執行new後才會分配記憶體,且為記憶體堆。
- 定義
- 類物件:利用類的建構函式(建構函式:對類進行初始化工作)在記憶體中分配一塊區域(包括一些成員變數賦值);
- 類指標:是一個記憶體地址值,指向記憶體中存放的類物件(包括一些成員變數賦值;類指標可以指向多個不同的物件,這就是多型);
- 使用
- 引用成員:物件使用“.”操作符,指標用“->”操作符;
- 生命週期:若是成員變數,則由類的解構函式來釋放空間;若是函式中臨時變數,則作用域是函式體內;而指標則需要利用delete在相應的地方釋放分配的記憶體塊。
- 注意:new與delete成對存在!!!
3.儲存位置 - 類物件:用的是記憶體棧,是個區域性的臨時變數;
- 類指標:用的是記憶體堆,是個永久變數,除非你釋放它。
- 訪問方式
- 指標變數是間接訪問,但可實現多型(通過父類指標可呼叫子類物件),並且沒有呼叫建構函式;
- 直接宣告可直接訪問,但不能實現多型,宣告即呼叫了建構函式(已分配了記憶體)
- 類物件和類指標聯絡
- 在類的宣告尚未完成的情況下,可以宣告指向該類的指標,但是不可宣告該類的物件;
- 父類的指標可以指向子類的物件。
- 指標與虛擬函式
要發揮虛擬函式的強大作用,必須使用指標來訪問物件。當類是有虛擬函式的基類,Func是它的一個虛擬函式,則呼叫Func時:類物件:呼叫的是它自己的Func;類指標:呼叫的是分配給它空間時那種類的Func。 - 什麼情況使用類物件與類指標?
其實作用基本一樣,都是為了呼叫類的成員變數和成員函式用的;當你希望明確使用這個類的時候,最好使用物件;如果你希望使用C++中的動態繫結,則最好使用指標或者引用,指標和引用用起來更靈活,容易實現多型等。而且指標佔用資源小,傳過去的就是4個位元組。如果用物件,引數傳遞佔用的資源就太大了。