面向過程(思想):以什麼正在發生為目標(強調的是演算法)
缺點:不容易維護,靈活性差,不容易擴充套件,不能復用;
物件導向:以什麼正在受影響為目標(建模)
耦合度:模組與模組存在的聯絡(越低越好) 多型
可復用,耦合度低(職責分離)
封裝:把「資料(屬性)」和「函式(操作)」合成乙個整體
內聯函式
關鍵字 inline 必須加在函式定義之前,放在函式宣告之前無效
內聯函式不需要像函式呼叫一樣 定址、壓棧、出棧
編譯器直接將使用相應的函式**替換函式呼叫
優勢 內聯函式不需要像函式呼叫一樣 定址、壓棧、出棧
節省開銷
內聯函式 「副本」
如果乙個內聯函式被多次呼叫 (假如乙個函式被在不同地方呼叫10次,那就有10個副本)
應該有選擇的使用內聯函式?
如果**執行的時間比處理函式呼叫機制時間更久,則節省的時間只佔整個過程一小部分,那就…
限制:1.避免內聯函式被多次呼叫
2.不能使用迴圈、條件語句、遞迴,取址(函式體不能過大)
內聯函式 和 巨集定義的區別:(為什麼要用內聯函式)
1.(何時處理)巨集定義在預編譯階段處理,內聯函式在編譯的時候展開;
2.編譯時候,內聯函式可以直接被鑲嵌到目標**;
巨集定義-文字替換;
3.內聯函式(本質還是乙個函式) 型別檢測,(語句是否正確);巨集定義不具備
4.巨集定義不是函式,內聯函式本質還是乙個函式
5.巨集在定義的時候要小心處理巨集引數(防止二義性)
#include
#define spow(x) x*x
using
namespace std;
inline
intpow
(int x)
intmain()
函式預設引數:
當函式呼叫沒有指定某個引數的值,編譯器會自動用預設值代替
從右向左新增預設值(預設值必須放在末尾)
函式過載
用同乙個函式名定義不同的函式
保證他們特徵標不同:
特徵標:如果兩個函式他們的引數列表 數目相同/型別相同/引數順序相同
條件:滿足三者其一
數目不同;
型別不同;
順序不同;
注意點:返回值是不能作為函式過載的條件
當函式過載遇上預設引數:
會產生二義性
函式過載機制:(靜態聯編:在編譯的時候就已經全部確定好要用哪個函式)
1.將所有同名函式作為候選者
2.嘗試尋找可行的候選方案:
1精確匹配
2通過預設引數能夠匹配的函式
3通過預設型別轉換匹配的
3.匹配失敗:
二義性/沒有候選者
封裝:把「資料(屬性)」和「函式(操作)」合成乙個整體
1.把屬性和操作封裝;
2.把屬性和操作進行訪問控制。
成員變數:資料(屬性)
成員函式:函式(操作)
設定許可權:
1.public:公有
2.private:私有
3.protected:被保護的(繼承)(如果沒有繼承 和private相同)
class 和 struct區別:
c語言中struct沒有成員函式,c++中可以有成員函式;
c++中 class 和 struct區別:
(c++語言中struct有成員函式)
許可權:class中如果沒有宣告許可權,預設private;
struct中如果沒有宣告許可權,預設public;
class還可以用來表示模板型別;struct不具備;
建構函式 析構函式
構造:是什麼? 函式名是與 類名相同 的特殊成員函式
什麼時候執行? 在每次建立物件的時候執行
作用? 在建立物件的時候初始化
形式? 函式名是與 類名相同
在定義時候可以有引數
沒有任何返回值(void也不行)
cuboid(《引數列表》)
怎麼呼叫? 大部分情況是自動呼叫,少部分情況手動呼叫
析構:是什麼? 函式名是與 類名近似 的特殊成員函式
什麼時候執行? 在每次銷毀物件的時候執行
作用? 清理物件
形式?在定義時候不可以有引數
沒有任何返回值(void也不行)
~cuboid(《引數列表》)
怎麼呼叫? 自動呼叫
#include
using
namespace std;
class
cuboid
intgetb()
intgetc()
intgets()
;int
getv()
;};cuboid::
cuboid
(int x,
int y,
int z)
cuboid::
~cuboid()
int cuboid::
gets()
int cuboid::
getv()
intmain()
初始化 賦值
int a = 1; 初始化
int b;
b = 2; 賦值
存在三個預設的函式
1.預設建構函式 什麼事都不做但依然會執行
2.預設的拷貝建構函式 將obj中所有成員變數的值賦給當前物件所有成員變數
3.預設析構函式
拷貝建構函式
test t1(1,2); 呼叫建構函式
test t2 = (3,4);
t2 = t1; 呼叫的是拷貝建構函式
形式 test(const test& obj)
何時呼叫?(1,2)
1.乙個物件需要通過另乙個物件進行初始化的時候 cuboid c2 = c1;
2.乙個物件以值傳遞的方式傳入函式體(作為引數)
3.乙個物件以值傳遞的方式從函式返回(作為返回值)
#include
using
namespace std;
class
cuboid
intgetb()
intgetc()
intgets()
;int
getv()
;int
func1
(cuboid obj)
; cuboid func2()
;};cuboid::
cuboid
(int x,
int y,
int z)
cuboid::
cuboid
(const cuboid& obj)
cuboid::
~cuboid()
int cuboid::
gets()
int cuboid::
getv()
int cuboid::
func1
(cuboid obj)
cuboid cuboid::
func2()
intmain()
meo學習筆記2 函式過載(C )
過載其實在是乙個很基礎的概念,我們用的時候也很多,但是我老是忘記相關的約定約束,下面就自己學習的相關問題做乙個整理吧,主要說明函式過載的含義 函式過載的形式等問題。參考書籍 c primer 簡而言之,如果同一作用域的幾個函式名字相同,但形參列表 引數型別和數量 不同,則稱為過載函式。需要注意的是,...
C 之函式過載(2)
函式過載就是函式多型 型別引用和型別被編譯器視為同乙個特徵標 過載區分const 和 非const void staff double ra matches modifiable lvalue void staff const double ra matches rvalue,const lvalu...
C 學習日記 運算子過載
c 運算子過載 賦予運算子另一種作用,實現自定義型別的運算 如物件 物件變成int int一樣 c 運算子過載內容 1.友元過載 友元 宣告 友元關係是單向的,不可傳遞 2.輸入輸出流過載 class cstring else cstring cstring const cstring src cs...