C++小結 析構函數、函數後面接冒號 等等

講在前面

本小結有析構函數、C++函數後面接:的含義 、C++中public、protected及private用法、條件運算符、fabs()和abs()區別、C++中的結構體內的函數、類中成員函數聲明後面接 const、C++中函數定義前加virtual關鍵字的作用。

析構函數

析構函數主要作用就是釋放資源,避免內存泄漏。析構函數與構造函數對應,當對象結束其生命週期,如對象所在的函數已調用完畢時,系統會自動執行析構函數。析構函數名也應與類名相同,只是在函數名前面加一個位取反符 ~,例如 ~stud( ),以區別於構造函數。它不能帶任何參數,也沒有返回值(包括void類型)。只能有一個析構函數,不能重載。

如果一個類中有指針,且在使用的過程中動態的申請了內存,那麼最好顯示構造析構函數在銷燬類之前,釋放掉申請的內存空間,避免內存泄漏。

按照 C++ 的要求,只要有 new 就要有相應的 delete 。這專個 new 是在構造函數裏 new 的,就是出生的時候。所以在死掉的時候,就是調用析構函數時,我們必須對指針進行 delete 操作。

C++函數後面接:的含義

c++成員函數後面跟“:”表示的是賦值,這是c++的特性

A( int aa, int bb ):a(aa),b(bb)
{
}
//相當於
A( int aa, int bb )
{
a=aa;
b=bb;
}

構造函數後加冒號是初始化表達式:
有四種情況下應該使用初始化表達式來初始化成員:
1:初始化const成員
2:初始化引用成員
3:當調用基類的構造函數,而它擁有一組參數時
4:當調用成員類的構造函數,而它擁有一組參數時。

冒號初始化是給數據成員分配內存空間時就進行初始化,就是說分配一個數據成員只要冒號後有此數據成員的賦值表達式(此表達式必須是括號賦值表達式),那麼分配了內存空間後在進入函數體之前給數據成員賦值,就是說初始化這個數據成員此時函數體還未執行。 對於在函數中初始化,是在所有的數據成員被分配內存空間後才進行的。

student ::student (int i,int j)
  {
     a=i;
     b=j;
   }
student ::student(int i,int j):a(i),b(j)
{
}

ConvexMPCLocomotion::ConvexMPCLocomotion() :
  horizonLength(10),//函數名後加冒號,相當於開了一個內存賦值的作用
  trotting(horizonLength, Vec4<int>(0,5,5,0), Vec4<int>(5,5,5,5),"Trotting"),  //這裏是賦值
  bounding(horizonLength, Vec4<int>(5,5,0,0),Vec4<int>(5,5,5,5),"Bounding"),
  pronking(horizonLength, Vec4<int>(0,0,0,0),Vec4<int>(4,4,4,4),"Pronking"),
  galloping(horizonLength, Vec4<int>(0,2,7,9),Vec4<int>(6,6,6,6),"Galloping"),
  standing(horizonLength, Vec4<int>(0,0,0,0),Vec4<int>(10,10,10,10),"Standing"),
  trotRunning(horizonLength, Vec4<int>(0,5,5,0),Vec4<int>(3,3,3,3),"Trot Running"),
  walking(horizonLength, Vec4<int>(0,3,5,8), Vec4<int>(5,5,5,5), "Walking"),
  walking2(horizonLength, Vec4<int>(0,5,5,0), Vec4<int>(7,7,7,7), "Walking2"),
  pacing(horizonLength, Vec4<int>(5,0,5,0),Vec4<int>(5,5,5,5),"Pacing")
{
  dtMPC = 0.001 * iterationsBetweenMPC;  //頭文件中定義了
  setup_problem(dtMPC, horizonLength, 0.4, 120);   //設置參數
  rpy_comp[0] = 0;
  rpy_comp[1] = 0;
  rpy_comp[2] = 0;
  rpy_int[0] = 0;
  rpy_int[1] = 0;
  rpy_int[2] = 0;

  for(int i = 0; i < 4; i++)
    firstSwing[i] = true;   // 賦值 正確,布爾量來的
}

C++中public、protected及private用法

1.類的一個特徵就是封裝,public和private作用就是實現這一目的。所以:

用戶代碼(類外)可以訪問public成員而不能訪問private成員;private成員只能由類成員(類內)和友元訪問。

2.類的另一個特徵就是繼承,protected的作用就是實現這一目的。所以:protected成員可以被派生類對象訪問,不能被用戶代碼(類外)訪問。

public, protected, private三種繼承方式,它們相應地改變了基類成員的訪問屬性

public繼承: 基類public成員,protected成員,private成員的訪問屬性在派生類中分別變成: public, protected, private (屬性還是保持不變)

protected繼承: 基類public成員,protected成員,private成員的訪問屬性在派生類中分別變成:protected, protected, private (公有變爲保護變量)

private繼承: 基類public成員,protected成員,private成員的訪問屬性在派生類中分別變成:private, private, private (全部變爲私有屬性的了)

但無論哪種繼承方式,上面兩點都沒有改變:

private成員只能被本類成員(類內)和友元訪問,不能被派生類訪問;

protected成員可以被派生類訪問。

繼承類就是別繼承類的派生類

條件運算符:

<表達式1>?<表達式2>:<表達式3> ;

含義是: 先求表達式1的值,如果爲真,則執行表達式2,並返回道表達式2的結果 ; 如果表達式1的值爲假,則執行表達式3 ,並返回表達式3的結果

fabs()和abs()區別

函數名: abs
功 能: 求整數的絕對值
用 法:

 int abs(int i);

返回的是|x|的值

函數名:fabs
功能:求浮點數x的絕對值
用法:

 float fabs(float j);
 double fabs(double j);

返回的是|x|的值

C++中的結構體內的函數

在C++中除了類中可以有構造函數和析構函數外,結構體中也可以包含構造函數和析構函數,這是因爲結構體和類基本雷同,唯一區別是,類中成員變量默認爲私有,而結構體中則爲公有。注意,C++中的結構體是可以有析構函數和構造函數,而C則不允許。

類中成員函數聲明後面接 const

const 表示對類中成員函數屬性的聲明;

表示不會修改類中的數據成員;

在編寫const成員函數時,若不慎修改了數據成員,或者調用了其他非const成員函數,編譯器將指出錯誤;

C++中函數定義前加virtual關鍵字的作用

加了Virtual關鍵字的函數就是虛擬函數,而=0的意思表示本類不對這個成員函數進行實現,即該成員函數沒有函數體,這種函數叫純虛函數。

class CShape
{
public:
    virtual void Show()=0;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章