html绑定带有形参的函数,C++中函数
參數
參數分為形參和實參,形參是在函數定義的形參表中進行定義,是一個變量,其作用域為整個函數。而實參出現在函數調用中,是一個表達式,用傳遞給函數的實參對形參進行初始化。
函數形參表可以為空,但不能省略。沒有任何形參的函數可以用空形參表或含有單個關鍵字void的形參表來表示。
C++是一種靜態強類型語言,對于每一次函數調用,編譯時都會檢查其實參。
每次函數調用時,都會重新創建該函數所有的形參,此時所傳遞的實參將會初始化對應的形參。
形參的初始化與變量的初始化一樣:如果形參具有非引用類型,則復制實參的值;如果形參為引用類型,則它只是實參的別名。
普通的非引用類型的參數通過復制對應的實參實現初始化。當用實參的副本初始化形參時,函數并沒有訪問調用所傳遞 的實參的本身,因此不會修改實參的值。
函數的形參可以為指針,此時將復制實參指針。與其他費引用類型的形參一樣,該類形參的任何改變也僅僅作用于局部副本。
指針形參是指向const類型還是飛const類型,將影響函數調用所使用的參數。可以將指向const對象的指針初始化為指向非const對象,但是不可以讓指向非const對象的指針指向const對象。
與所有引用一樣,引用形參直接關聯到其所綁定的對象,而并非這些對象的副本。另外,如果使用引用形參的唯一目的是避免復制實參,則應將形參定義為const引用。
關于傳遞指向指針引用,這個對于我來說,比較難理解啊,總想不明白為啥這樣定義。下面舉個例子:
假如想編寫一個交換兩個整數的swap函數,實現兩個指針的交換。已知需用*定義指針,用&定義引用。現在,問題是如何將這兩個操作符結合起來以獲得指向指針的引用。
void swap(int *&v1, int *&v2)
{
int *tmp = v2;
v2 = v1;
v1 = tmp;
}
形參int *&v1
頂定義從右往左理解:v1是一個引用,與指向int型對象的指針相關聯。也就是說,v1只是傳遞進swap函數的任意指針的別名。
返回值
這里要記錄的是自己需要注意的地方。
(1)返回非引用類型
用函數返回值初始化臨時對象與用實參初始化形參是一樣的。如果返回類型不是引用,在調用函數的地方會將函數返回值復制給臨時對象。當函數返回非引用類型時,其返回值即可以是局部對象,也可以是求解表達式的結果。
(2)返回引用
當函數返回引用類型時,沒有復制返回值。相反,返回的是對象本身。考慮下面的函數,此函數返回兩個string類型形參中較短的那個字符串的引用:
const string &shortstring(const string &s1, const string &s2)
{
return s1.size() < s2.size() ? s1 : s2;
}
形參和返回類型都是指向const string類型的引用,調用函數和返回結果時,都沒有復制這些string對象。
記住:千萬不要返回局部變量的引用。(3)引用返回左值
返回引用的函數返回一個左值。因此,這樣的函數可用于任何要求使用左值的地方:
char &get_val(string &str, string::size_type ix)
{
return str[ix];
}
int main()
{
string s("a value");
cout << s << endl;
get_val(s, 0) = 'A'; //change s[0] to A
cout << s << endl;
return 0;
}
給函數返回值賦值可能讓人驚訝,由于函數返回的是一個引用,因此是正確的。
如果不希望引用返回值被修改,返回值應該聲明為:const char &get_val(.....)。
(5)千萬不要返回指向局部變量的指針
一旦函數結束,局部對象被釋放,返回的指針就變成了指向不在存在的對象的懸垂指針。
默認實參
當一個函數具有多個參數時,定義默認參數的方向是從右向左的,即以最后一個參數定位的;而匹配參數的方向是從左向右的,即以第一個參數定位的,如下圖所示。
上圖來自網友,具體出處忘記了,感謝。
如果我們要定義默認參數,那么我們必須從最后一個參數定義起,并且逐漸向前(左)定義,不可以跳過某個參數,直到所有的形參都被定義了默認值。
如果我們調用了一個定義了默認參數的函數,那么我們填寫的第一個參數一定是和最左邊的形參匹配,并且逐漸向后(右)匹配,不可以中途省略某一個參數,直到所有未被設置默認值的形參都已經有參數。
于是,調用函數時,用戶向右自定義的實參至少要和向左來的已經定義的默認參數的形參相鄰,函數才能被成功調用。否則這個函數就是缺少參數的。
指定默認實參的約束:
既可以在函數聲明也可以在函數定義中指定默認實參。但是,在一個文件中,只能為一個形參指定默認實參一次。下面的例子是錯誤的:
//ff.h
int ff(int = 0);
//ff.cc
#include "ff.h"
int ff(int = 0){....} //error
通常,應該在函數聲明中指定默認實參,并將該聲明放在合適的頭文件中。
指向函數的指針
函數指針是指指向函數而非指向對象的指針。
bool (*pf)(const string &, const string &);
這個語句將pf聲明為指向函數的指針,它所指向的函數待遇兩個const string&類型的形參和bool類型的返回值。
(1)用typedef簡化函數指針的定義
使用typedef為指針定義同義詞,可以使函數指針的使用大大的簡化:
typedef bool (*cmpfcn)(const string &, const string &);
該定義表示了cmpfcn是一種指向函數的指針類型的名字。在要使用這種函數指針的類型時,只需要直接使用cmpfcn就可以了。
(2)指向函數的指針的初始化和賦值
**在引用函數名單又沒有調用該函數時,函數名將被自動解釋為指向函數的指針。假如有函數:
bool lengthcompare(const string &, const string &);
除了用作函數調用的左操作數外,對lengthcompare的任何使用都被解釋為如下類型的指針:
bool (*)(const string &, const string &);
可以使用函數名對函數指針進行初始化或賦值:
cmpfcn pf1 = 0; //ok:unbound pointer to function
cmpfcn pf2 = lengthcompare;??//ok:pointer type matches function's type
pf1 = lengthcompare;? ? ? ? ?//ok:pointer type matches function's type
pf2 = pf1;? ? ? ? ? ? ? ? ? ?//ok:pointer types match
此時,直接引用函數名等效于在函數名上應用取地址操作符:
cmpfcn pf1 = lengthcompare;
cm[fcn pf2 = &lengthcompare;
記住:函數指針只能通過同類型的函數或者函數指針或0值常量表達式進行初始化或賦值。
將函數指針初始化為0,表示該指針不指向任何函數。
指向不同函數類型的指針之間不存在轉換:
string::size_type sunlength(const string &, const string &)'
bool cstringcmpare(char *, char *);
cmpfcn pf;
pf = sunlength;? ? ?//error:return type deffers
pf = cstringcompare;//error:parameter types differ
pf = lengthcompare; //ok:function and pointer types match exactly
(3)通過指針調用函數
指向函數的指針可用于調用它指向的函數。可以不需要使用解引用操作符,直接通過指針調用函數:
cmpfcn pf = lengthcompare;
lengthcompare("hi","bye");
pf("hi", "bye");
(*pf)("hi", "bye");
(4)函數指針形參
函數的形參可以是指向函數的指針。這種形參可以用以下兩種形式編寫:
void useBigger(const string &, const string &,bool (const string &, const string &));
void useBigger(const string &, const string &, bool (*)(const string &, const string &));
(5)返回指向函數的指針
函數可以返回指向函數的指針,但是,正確的寫出這種返回類型相當不容易:
int (*ff(int))(int *, int *);
提醒:閱讀函數指針聲明的最佳方式是從聲明的名字開始由里而外理解。
要理解該聲明的含義,首先觀察:
ff(int)
將ff聲明為一個函數,它帶有一個int型的參數。該函數返回
int (*)(int *, int);
它是一個指向函數的指針,所指向的函數返回int型并帶有兩個分別為int *型和int型的形參。使用typedef可使該定義更簡明易懂:
typedef int (*pf)(int *, int);
pf ff(int);
總結
以上是生活随笔為你收集整理的html绑定带有形参的函数,C++中函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大于3小于4的整数bleem_比三大,比
- 下一篇: css样式全大写,用css样式表实现首字