引用型形參
利用引用形參耻姥,交換兩個(gè)數(shù)的值
void rSwap(int &v1, int &v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
利用引用型的形參,可以解決函數(shù)只能返回一個(gè)值得情況
比如套像,在某個(gè)vector中尋找某個(gè)特定的值景馁,然后返回它出現(xiàn)的位置及出現(xiàn)的次數(shù)
vector<int>::const_iterator findValue(
vector<int>::const_iterator begin,
vector<int>::const_iterator end,
int value,
vector<int>::size_type &occurs)
{
vector<int>::const_iterator result_iter = end;
occurs = 0;
for (; begin != end; ++begin)
{
if (*begin == value)
{
// remember first occurrence of value
if (result_iter == end)
{
result_iter = begin;
}
++occurs;
}
}
return result_iter;
}
利用const引用避免復(fù)制
一般的形參傳遞時(shí)需要復(fù)制,引用不需要斥难。當(dāng)使用大型引用形參時(shí)枝嘶,為了避免復(fù)制實(shí)參,使用const引用蘸炸。
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
形參是引用,所以不需要復(fù)制實(shí)參尖奔;形參是const搭儒,所以不能通過該引用形參來修改實(shí)參的值。
傳遞指針的引用
交換指向數(shù)值的指針
void prSwap(int *&v1, int *&v2)
{
int *temp = v1;
v1 = v2;
v2 = temp;
}
vector或其他容器作為形參
為避免直接使用vector等類型做形參提茁,一般使用它們的迭代器淹禾。
void print( vector<int>::const_iterator begin,
vector<int>::const_iterator end)
{
while(begin != end)
{
cout << *begin++;
if (begin != end) cout << " ";
}
cout << endl;
}
數(shù)組作為形參
肯定不能直接傳遞數(shù)組,通常使用指針進(jìn)行操作茴扁。而下面三種是等價(jià)的
void print(int *);
void print(int[]);
void print(int[10]);
但是后兩種很容易引起誤解铃岔。下面可以看出是否真的等價(jià)
void printv(const int ia[10])
{
for (size_t i = 0; i != 10; ++i)
{
cout << ia[i] << endl;
}
}
int v1 = 32, arr[2] = {4, 0};
printv(&v1); //編譯ok, 但會(huì)輸出其他9個(gè)其他的值或者運(yùn)行時(shí)錯(cuò)誤
printv(arr); //編譯ok, 但會(huì)輸出其他8個(gè)其他的值或者運(yùn)行時(shí)錯(cuò)誤
編譯器不會(huì)檢查形參數(shù)組的大小。
通過引用傳遞數(shù)組
一般來講,將數(shù)組作為形參傳遞給函數(shù)都會(huì)被轉(zhuǎn)換為指針毁习,但是數(shù)組的引用不會(huì)智嚷。此時(shí),傳遞的是數(shù)組的引用本身纺且,編譯器會(huì)檢查形參數(shù)組的大小盏道。
void print(int (&arr)[3]);
int i = 0, j[2] = {0, 1};
int k[3] = {0, 1, 2};
print(&i); // error
print(j); // error
print(k); // ok
多維數(shù)組的傳遞
所謂多維數(shù)組,就是數(shù)組的數(shù)組载碌。它的每個(gè)元素就是一個(gè)數(shù)組猜嘱,第二維必須指定
void print(int (matrix*)[10], int row_size);
// 或者
void print(int matrix[][10], int row_size);
matrix
是指向含10個(gè)int值的數(shù)組的指針。
在函數(shù)內(nèi)處理數(shù)組
任何數(shù)組的操作都必須保持在數(shù)組的邊界內(nèi)嫁艇。
有三種常見的方法可以保證這一點(diǎn):
- 第一種是在數(shù)組的本身放置一個(gè)標(biāo)記進(jìn)行檢測(cè)數(shù)組的結(jié)束朗伶。如C風(fēng)格的字符串,使用
\0
標(biāo)記表示結(jié)束步咪; - 第二種是傳遞指向數(shù)組的第一個(gè)和最后一個(gè)元素的下一個(gè)位置的指針论皆;
- 顯式地傳遞數(shù)組的大小。意思是告訴函數(shù)歧斟,我的大小是多少纯丸;
void print(const int ia[], size_t size)
{
for (size_t i = 0; i < size; ++i)
{
cout << ia[i] << endl;
}
}
END.