C++——內聯,友元
一、內聯(inline)
以inline修飾的函式叫行內函數,編譯時c++編譯器會在呼叫行內函數的地方將其展開,沒有函式壓棧的開銷,行內函數提升程式執行的效率。
- inline時一種以時間換空間的做法,省去呼叫函式的開銷,所以程式碼很長或內部有迴圈,遞迴的函式不適宜使用內聯
- inline對編譯器只是一個建議,編譯器會自動優化。如果定義為inline的函式體內有迴圈/遞迴等等,編譯器優化時會忽略掉內聯
- inline必須和函式的定義放在一起,才能稱為行內函數,僅將inline放在宣告前時不起作用的
- 定義在類內的成員函式預設為行內函數
class Date
{
public:
void Func()//定義在類內的函式預設為行內函數
{}
void Display();
private:
int _year;
int _month;
int _day;
};
inline void Date::Display()//成員函式類外定義為內聯
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl;
}
inline void Test()//全域性函式定義為內聯
{}
儘量使用const,enum,inline替換#define,為什麼?
巨集的優點:
- 程式碼的複用性強
- 可以提高程式的效能
巨集的缺點:
- 不能除錯(預處理階段即進行了替換)
- 沒有型別檢查
- 可讀寫差,可維護性差
而#define定義的常量我們可以用const,enum代替,#define定義的巨集我們可以用inline進行替換,他們有著巨集的優點,卻不具備巨集的缺點。c++通過內聯機制,既具備巨集程式碼的效率,又增加了安全性,還可以資源操作類的資料成員,算是一個比較完美的解決方案
inline和巨集的區別:
- 行內函數和巨集一樣,將在被呼叫處進行程式碼展開,省去了引數壓棧,棧幀開闢回收的開銷,從而提高了程式的執行速度
- 行內函數相比巨集來說,在程式碼展開時,會做安全檢查或自動型別轉化,而巨集定義沒有引數型別檢查。
- 在類中宣告同時定義的成員函式預設為行內函數,使用行內函數可以訪問雷達成員變數,巨集定義則不能。
- 行內函數在執行時可以除錯,而巨集定義不能
二、友元(friend)
友元函式:
在C++中友元函式允許在類外訪問該類中的任何成員,就像成員函式用於,友元函式用關鍵字friend宣告
- 友元函式不是類的成員函式
- 友元函式可以通過物件訪問使用成員,私有和保護成員也一樣
class Date
{
friend void Display(const Date &d);//定義為友元
private:
int _year;
int _month;
int _day;
};
void Display(const Date &d)//類外訪問其私有成員
{
cout << "year:" << d._year << endl;
cout << "month:" << d._month << endl;
cout << "day:" << d._day << endl;
}
void Test()
{
Date d1;
Display(d1);
}
輸入輸出運算子的友元函式
1.類中只要六個成員函式在不得已時會預設生成,其餘的如<<, >>要使用的話,必須過載
2.operator<<可以定義為成員函式嗎?
- 可以將其放在類內定義,但是呼叫時的方式為d1.operator<<(cout)不符合我們常規的輸出方式,所以建議在類外定義
定義在類內:
如果按我們的輸出方式輸出的話會報錯:
所以建議定義在類外
class Date
{
public:
friend ostream & operator<< (ostream& os, const Date& d);
friend istream & operator>>(istream& is, const Date& d);
private:
int _year;
int _month;
int _day;
};
ostream & operator << (ostream& os, const Date& d)
{
os << "year:" << d._year << endl;
os << "month:" << d._month << endl;
os << "day:" << d._day << endl;
return os;
}
istream & operator>> (istream& is, const Date& d)
{
cout << "請輸入年月日" << endl;
is >> d._year;
is >> d._month;
is >> d._day;
return is;
}
3.operator<<函式的返回值,可以是void嗎?
- 不可以,因為我們要實現鏈式輸出,所以要用ostream&,istream&
友元類:
整個類可以是另一個類的友元,友元類的每個成員函式都是另一個類的友元函式,都可以訪問另一個類中的保護或者私有的資料成員
class Time
{
friend class Date;//Date是Time的友元,它可以訪問Time的私有成員
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
void Display()
{
cout << _year << endl;
cout << _month << endl;
cout << _day << endl;
cout << _t._hour << endl;
cout << _t._minute << endl;
cout << _t._second << endl;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
友元一定程度上破壞了c++的封裝性,所以要用在適當的地方
相關文章
- C++中的友元C++
- 友元
- 友聯
- C++類將函式模板宣告為友元 例項C++函式
- 07友元
- c++單例模式、常量成員函式、引數傳遞、友元C++單例模式函式
- 其他成員與友元
- 友元類的使用方法
- 類别範本與友元
- 友元函式的使用方法函式
- 塊級、內聯、內聯塊級
- C++之友元成員C++
- C++行內函數C++函數
- 享元模式(c++實現)模式C++
- 塊狀元素、內聯元素和內聯塊狀元素
- C語言與C++有聯絡,有區別,這些內容要了解!C語言
- iframe內聯框架框架
- c++內建函式物件C++函式物件
- c++中內建函式C++函式
- 國內首家決策智慧公司浮出水面,啟元世界給你一個會配合走位的AI隊友AI
- 內聯元素與流
- GCC 內聯彙編GC
- 過載和內聯
- C++中行內函數的用法C++函數
- C++內嵌彙編 教程1C++
- 《使命召喚手遊》聯合水友賽總決賽正式拉開帷幕 萬元現金大獎即將揭曉
- C++之父談C++ :一天之內你就能學會出色使用C++C++
- CSS塊級/內聯元素CSS
- 內聯的優缺點
- Java中的方法內聯Java
- 64位內聯彙編
- C++整理4_行內函數C++函數
- 從動物森友會聊主機遊戲聯機機制遊戲
- 幾乎無所不能的C++程式語言,網友:確實有點6C++
- c++結構體、共用體(聯合體)C++結構體
- C++ Qt開發:使用關聯容器類C++QT
- C++ Qt開發:SqlRelationalTable關聯表元件C++QTSQL元件
- 剛剛,Python內幕被爆出!網友:請收下我的膝蓋!Python