C++入門小知識(二)const修飾成員函數,內聯函數,有元,靜態成員的理解

c++入門小知識總結(二)

const修飾的成員函數

如果學過C語言,那麼對const有一定的瞭解,const修飾的變量不能能夠被改變,修飾指針呢,指針不能被改變等。。。
在C++中const修飾的成員函數,那麼可以推測一下,是不是它所修飾的成員函數不能改變呢?答案是no 不是說它所修飾的成員函數不能被改變,而是它所要接受的對象在本函數中不能不改變。
怎麼來修飾成員函數呢?
舉個例子:

class Date
{
public:
void Print()const // 這就是const修飾的成員函數
{
    cout << _year << "-" << _month << "-" << _day << endl;
}
private:
    int _year;
    int _month;
    int _day;
};

用const修飾的成員函數在傳對象的時候可以傳非const修飾的對象,也可以傳被const修飾的對象。
如果被const修飾的對象,就不能傳給沒有被const修飾的成員函數。
在這裏總結,被const修飾的權限小,而沒修飾的權限大,記住權限只能縮小,不能放大。在傳參的過程中。

內聯函數

關鍵字inline
被inline修飾的函數叫內斂函數。內斂函數一般在編譯的時候會將函數展開,美譽壓棧的開銷,是一種空間換時間的做法,提高了代碼的運行速率,但代碼量加大。
這裏有三點需要注意:

  1. 在對函數進行修飾爲inline時,這時只是對編譯器的一個建議,編譯器可以採用,也可以不採用。如果定義的內斂函數出現在循環遞歸等重複性比較高的時候,編譯器會自動優化,把inline函數變成一般函數。
  2. inline必須和函數定義放在一塊才能生效,如果和聲明放在一塊是不會有作用。
  3. 如果在定義函數時放在類裏面定義,那麼系統會自動的默認爲內斂函數,但是具體是否被當作內斂函數所執行,那就看編譯器是如何優化的。

關於內斂函數的用途我們還可以想到#define宏函數。它也是一種空間換時間的做法。但是兩者又有很多差異。
我們來分析一下它們的優缺點:
優點:
內斂函數:提高了代碼的運行效率。代碼可以進行調試。有了類型的檢查。
宏:提高了代碼的運行效率,可以代替單個變量。
缺點:
內斂函數:不能代替單個變量,受到編譯器的限制
宏:不方便調試,代碼可讀性差,維護性差,容易誤用,沒有類型檢查。

友元

友元函數
友元函數說明:友元函數在類外允許訪問類中的任何成員。關鍵字friend
注意兩點:

  1. 友元函數不是類的成員函數,所以不能通過類來訪問友元函數。
  2. 友元函數可以通過對象訪問所有成員,包括私有的和保護的。

友元函數使用聲明友元函數必須在類的public並且需要加上friend關鍵字。
函數定義處不用添加關鍵字friend
例如:

class Date
{
public:
    friend void Print();
private:
    int _year;
    int _month;
    int _day;
};
void Print()
{
    cout << _year << "-" << _month << "-" << _day << endl;
}

上面的void Print()函數就是一個友元函數。
在類外面定義的函數,是Date類的友元函數,那麼類外的函數就可以直接訪問類裏面的成員變量,不管是受到保護的還是私有的。
友元類
一個類可以成爲另一個類的友元類,那麼這個類的所有成員函數都是另一個類的友元函數。
我們來舉個例子:

class Date
{
private:
    int _year;
    int _month;
    int _day;
};
class Time
{
public:
    friend class Date;
private:
    int _hour;
    int _minute;
    int _second;
};

這裏的Date類就是Time;類的友元類,Date的所有成員函數都是Time類的友元函數。
在面向對象編程中有三大特性:封裝, 繼承, 多態。
但是友元破環了封裝性,所以儘量少用。

靜態成員

類的靜態成員變量
靜態成員關鍵字static 在所需要定義的變量或者函數前面加上關鍵字。
靜態成員變量是該類的所有對象的共享成員變量。所以在類中初始化靜態成員變量時,不能在構造函數中初始化靜態成員變量。
例如:

class Date
{
private:
    int _year;
    int _month;
    static int _count;
    int _day;
};
// 靜態變量的初始化
int Date::_count = 0;

靜態成員函數
靜態成員函數也是所有對象共享的。
要注意的是靜態成員函數沒有隱含的this指針,所以在調用靜態成員函數時,直接用類名加域符號和靜態成員函數。
比如:

ass Date
{
public:
    static void Print()
    {
    cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    // 靜態成員函數的調用
    Date::Print();
    return 0;
}

這裏還有兩點
靜態成員函數不可以訪非靜態成員(沒有this指針)
非靜態成員函數可以訪問靜態成員

發佈了74 篇原創文章 · 獲贊 35 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章