C 基礎(3)函式

2021-10-07 15:27:35 字數 2446 閱讀 6707

c++從c中繼承的乙個重要特徵就是效率。假如c++的效率明顯低於c的效率,那麼就會有很大的一批程式設計師不去使用c++了。

c語言中如果多次使用乙個簡單計算那麼就會使用巨集定義乙個計算,計算寫成巨集,而不是函式,這樣做的理由是為了執行效率,巨集可以避免函式呼叫的開銷,這些都由預處理來完成。但是在c++這就會造成一些問題

第乙個在c中也會出現,巨集看起來像乙個函式呼叫,但是會有隱藏一些難以發現的錯誤。

第二個問題是c++特有的,預處理器不允許訪問類的成員,也就是說預處理器巨集不能用作類的成員函式。

因此為了解決這些問題,c++提出了內聯函式(inline function):

內聯函式為了繼承巨集函式的效率,沒有函式呼叫時開銷,然後又可以像普通函式那樣,可以進行引數,返回值型別的安全檢查,又可以作為成員函式。

在普通函式(非成員函式)函式前面加上inline關鍵字使之成為內聯函式。但是必須注意必須函式體和宣告結合在一起,否則編譯器將它作為普通函式來對待。

inline

intfunc

(int a)

//這是有效的內聯函式

inline

void

func

(int a)

;//這是無效的,不會被編譯器識別為內聯函式

可以簡單理解為內聯函式是以空間換時間,省去了函式呼叫時候的壓棧,跳轉,返回的開銷

在類內部定義內聯函式時並不是必須的。任何在類內部定義的函式自動成為內聯函式。

class

person

void

printperson()

}

建構函式person,成員函式printperson在類的內部定義,自動成為內聯函式。

注意:內聯僅僅只是給編譯器乙個建議,編譯器不一定會接受這種建議,如果你沒有將函式宣告為內聯函式,那麼編譯器也可能將此函式做內聯編譯。乙個好的編譯器將會內聯小的、簡單的函式作為內聯函式。

一些內聯函式的基本要求

c++在宣告函式原型的時可為乙個或者多個引數指定預設(預設)的引數值,當函式呼叫的時候如果沒有指定這個值,編譯器會自動用預設值代替。

void

testfunc01

(int a =10,

int b =20)

//注意點:

//1. 形參b設定預設引數值,那麼後面位置的形參c也需要設定預設引數

void

testfunc02

(int a,

int b =10,

int c =10)

//2. 如果函式宣告和函式定義分開,函式宣告設定了預設引數,函式定義不能再設定預設引數

void

testfunc03

(int a =0,

int b =0)

;void

testfunc03

(int a,

int b)

intmain()

c++在宣告函式時,可以設定佔位引數。佔位引數只有引數型別宣告,而沒有引數名宣告。一般情況下,在函式體內部無法使用佔位引數。但是傳引數時必須傳入引數

void

testfunc01

(int a,

int b,

int)

//佔位引數也可以設定預設值

void

testfunc02

(int a,

int b,

int=20)

intmain()

能使名字方便使用,是任何程式語言的乙個重要特徵!

函式過載的目的就是為了方便的使用函式名。

條件:

//1. 函式過載條件

namespace a

void

myfunc

(int a)

void

myfunc

(string b)

void

myfunc

(int a, string b)

void

myfunc

(string b,

int a)

}//2.返回值不作為函式過載依據

namespace b

//int myfunc(string b, int a){} //無法過載僅按返回值區分的函式

}//注意: 函式過載和預設引數一起使用,需要額外注意二義性問題的產生。

void

myfunc

(string b)

//函式過載碰上預設引數

void

myfunc

(string b,

int a =10)

intmain()

C 基礎學習(3) 建構函式

3.建構函式的過載 4.帶預設引數的建構函式 5.預設建構函式 6.複製建構函式與合成複製建構函式 7.深複製和淺複製 1.什麼是建構函式 建立乙個物件時通常最需要立即做的就是初始化物件,如對資料成員賦初值,建構函式就是用來在建立物件時初始化物件,為物件賦初值的 2.建構函式的定義 定義建構函式 說...

C 基礎3 拷貝 複製 建構函式

使用類建立物件時,建構函式被自動呼叫以完成物件的初始化,那麼能否象簡單變數的初始化一樣,直接用乙個物件來初始化另乙個物件呢?答案是可以 student s1 student s2 s1 像這種語句在語法上是合法的。初始化s2,相當於將s1中每個資料成員的值複製到s2中,這是表面現象。實際上,系統呼叫...

scala基礎3 函式

常規函式 def f x int int 無返回值,使用unit def f unit unit和其他型別都可以省略,scala可以執行判斷函式的返回型別 def f f def f print f 無返回值,可以省略,unit不能寫 def f 無參函式 def f println hello f...