1. 程式人生 > 實用技巧 >C++面向物件筆記丨類、派生、繼承、多型(複習連更中)

C++面向物件筆記丨類、派生、繼承、多型(複習連更中)

概述

複習材料:

  1. 教材,
  2. 部落格包含但不限於Haorical,阿騰木,眼裡有光~,Theoyu²,查又恩,野渡書生等各位大佬
  3. Today WA,tomorrow AC.
  4. Study smart not hard.

結合小題理解

  1. 不能被派生的函式有建構函式,解構函式,友元函式
  2. 建構函式不能被宣告為虛擬函式,解構函式可以被宣告為虛擬函式(虛擬函式的引數型別,順序,個數必須一樣)
  3. 建構函式可以被過載,解構函式不可以被過載。
  4. 很多的const(填坑)
    常資料成員
  • 建構函式對常資料成員進行初始化時只能通過初始化列表進行
  • 常資料成員在定義時必須初始化
  • 如果類有多個預設建構函式必須都初始化常資料成員
    常成員函式
  • 只能呼叫常成員函式和常資料成員。
  • 常成員函式可以被其他成員函式呼叫,但是不能呼叫其他非常成員函式
  • 例如:已知const A a, 其中A是一個類名,指向常物件指標的表示為const A *pa
  1. 多型呼叫是指藉助於指向物件的基類指標或引用呼叫一個虛擬函式(以任何方式錯,純虛函錯)
  2. 派生類建構函式的成員初始化列表中,能包含基類的建構函式、派生類中子物件的初始化、派生類中一般資料成員的初始化,但是,不能包含基類中子物件的初始化
  3. 虛擬函式具有繼承性,是一個成員函式,靜態成員函式不可以說明為虛擬函式
  4. 必須使用引數初始化表的三種情況
  • 需要初始化的資料成員是物件的情況(這裡包含了繼承情況下,通過顯示呼叫父類的建構函式對父類資料成員進行初始化);
  • 需要初始化const修飾的類成員或初始化引用成員資料;
  • 子類初始化父類的私有成員;(有無示例)

結合大題程式碼理解

Shape類(派生、虛擬函式、類物件、類指標)

定義一個Shape基類,在此基礎上派生出RectangleCircle類,二者都有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後才會分配記憶體,且為記憶體堆。

  1. 定義
  • 類物件:利用類的建構函式(建構函式:對類進行初始化工作)在記憶體中分配一塊區域(包括一些成員變數賦值);
  • 類指標:是一個記憶體地址值,指向記憶體中存放的類物件(包括一些成員變數賦值;類指標可以指向多個不同的物件,這就是多型);
  1. 使用
  • 引用成員:物件使用“.”操作符,指標用“->”操作符;
  • 生命週期:若是成員變數,則由類的解構函式來釋放空間;若是函式中臨時變數,則作用域是函式體內;而指標則需要利用delete在相應的地方釋放分配的記憶體塊。
  • 注意:new與delete成對存在!!!
    3.儲存位置
  • 類物件:用的是記憶體棧,是個區域性的臨時變數;
  • 類指標:用的是記憶體堆,是個永久變數,除非你釋放它。
  1. 訪問方式
  • 指標變數是間接訪問,但可實現多型(通過父類指標可呼叫子類物件),並且沒有呼叫建構函式
  • 直接宣告可直接訪問,但不能實現多型,宣告即呼叫了建構函式(已分配了記憶體)
  1. 類物件和類指標聯絡
  • 在類的宣告尚未完成的情況下,可以宣告指向該類的指標,但是不可宣告該類的物件
  • 父類的指標可以指向子類的物件。
  1. 指標與虛擬函式
    要發揮虛擬函式的強大作用,必須使用指標來訪問物件。當類是有虛擬函式的基類,Func是它的一個虛擬函式,則呼叫Func時:類物件:呼叫的是它自己的Func;類指標:呼叫的是分配給它空間時那種類的Func。
  2. 什麼情況使用類物件與類指標?
    其實作用基本一樣,都是為了呼叫類的成員變數和成員函式用的;當你希望明確使用這個類的時候,最好使用物件;如果你希望使用C++中的動態繫結,則最好使用指標或者引用,指標和引用用起來更靈活,容易實現多型等。而且指標佔用資源小,傳過去的就是4個位元組。如果用物件,引數傳遞佔用的資源就太大了。