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...