C 的學習日記2(函式過載)

2021-10-16 18:46:04 字數 3902 閱讀 2230

面向過程(思想):以什麼正在發生為目標(強調的是演算法)

缺點:不容易維護,靈活性差,不容易擴充套件,不能復用;

物件導向:以什麼正在受影響為目標(建模)

耦合度:模組與模組存在的聯絡(越低越好) 多型

可復用,耦合度低(職責分離)

封裝:把「資料(屬性)」和「函式(操作)」合成乙個整體

內聯函式

關鍵字 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...