const修飾成員函數
在成員函數后面加一個const, const修飾this指針指向的對象, 保證調用這個const成員函數的對象在函數內不會被改變
注意:成員函數如果不修改成員變量,則加上const,成員函數如果要修改成員變量,此時就不能給其加上const修飾了
1.const對象不能調用非const成員函數,可以調用const成員函數
2.非const對象可以調用非const成員函數和const成員函數
3.const成員函數可以調用其他的const成員函數,但是不能調用其他的非const成員函數
4.非const成員函數內可以調用其他const成員函數和非const成員函數
總結一下,對象在調用成員函數的時候作用域只能縮小,不能增大.
inline內聯
用inline關鍵字修飾的函數 叫做內斂函數,編譯器在進行編譯的時候,會在調用該函數的地方將該函數進行展開, 沒有函數的壓棧過程,因此內聯函數運行效率較高
1.inline是一種以空間換時間的做法, 省去了調用函數時候的壓棧開銷, 因此循環遞歸等不適宜內聯函數
2.內聯函數只是一個建議,編譯會將其自動優化,如果涉及到的函數是遞歸循環等, 編譯器會將內聯忽略
3.定義在類內的函數默認為是內聯函數
宏的優點以及缺點
宏的優點
增加代碼的復用性,提高性能
宏的缺點
宏不方便調試,因為宏的展開是在預處理階段對其進行展開的
宏的可讀性較差,可維護性較差, 如果不注意會導致錯誤
宏無類型,安全機制較差
友元
友元函數:突破類的封裝過程
在c++中友元函數允許在類外訪問該雷的所有成員函數,就像成員函數一樣, 友元函數只需要在該函數前面加上關鍵字friend
友元函數可以通過對象訪問所有成員,私有和保護也一樣
友元類:
有兩個類 A 和 B, 其中A類的私有成員之一是B類的一個對象, 此時此時A類就是B類的友元類
class Date
{friend void Show(const Date& d);friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);friend class Time;
public:Date(int year = 1900, int month = 1, int day = 1):_year(year),_month(month),_day(day){cout << "Date(int year = 1900, int month = 1, int day = 1)" << endl;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}~Date(){cout << "~Date()" << endl;}Date(const Date& d){this -> _year = d._year;this -> _month = d._month;this -> _day = d._day;cout << "Date(const Date& d)" << endl;}Date& operator = (const Date& d){this -> _year = d._year;this -> _month = d._month;this -> _day = d._day;cout << "Date& operator = (const Date& d)" << endl;return *this;}
private:int _year;int _month;int _day;
};class Time
{
public:Time(int year = 1900, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0):_hour(hour),_minute(minute),_second(second){_d._year = year;_d._month = month;_d._day = day;}void Show(){cout << _d._year << "-" << _d._month << "-" << _d._day << endl;cout << _hour << ":" << _minute << ":" << _second << endl;}
private:int _hour;int _minute;int _second;Date _d;
};
注意: 不是任何時候友元都比較好, 我們應該知道友元是對類的封裝的一個突破, 所以應在下檔的時候使用.
類的靜態成員
類里面的成員用static 關鍵字進行修飾的都叫做靜態成員. 其中靜態成員是屬于這個類的不屬于某個對象,即static成員屬于這個類的所有對象,不被某個對象所獨有
靜態成員函數沒有隱含的this指針,那么在訪問靜態成員函數的時候只需要使用了類型::作用域訪問符便可以調用該靜態成員函數
//代碼展示:
class Date
{
public:Date(){sCount++;cout << "Date() " << endl;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}static void PrintCount(){cout << "Date count:" << sCount << endl;}
private:int _year;int _month;int _day;
private:static int sCount;
};int Date::sCount = 0;void Test()
{Date d1,d2;Date::PrintCount();
}
注意靜態成員函數不能訪問非靜態成員,但是非靜態成員函數可以訪問靜態成員
幾個小細節
1.匿名對象(date())存在的生命周期是它所在的那一行, 同時也要注意當我們已經自己寫了拷貝構造函數的時候, 此時編譯器就不會自動生成構造函數
2.等號兩邊兩個類型不同的時候小類型會轉向大類型
3.在寫工程時,為什么.cpp和.h分開
(1)方便閱讀
(2)封裝(開源和閉源)
(3)提高編譯速度