什么是引用
引用其實(shí)就是變量的別名瘫辩,在C++中肝匆,它主要用作函數(shù)形參,于是函數(shù)可以修改傳入?yún)?shù)的原始數(shù)據(jù)装哆,而不在是數(shù)據(jù)的副本罐脊。
引用與指針
如果函數(shù)參數(shù)聲明為指針,其實(shí)也可以操作原始數(shù)據(jù)蜕琴,如下
#include <iostream>
struct Person
{
std::string name;
};
void changeName(Person & person)
{
// 因?yàn)橐檬亲兞康膭e名萍桌,因此可以使用點(diǎn)號(hào)來(lái)訪問(wèn)結(jié)構(gòu)變量
person.name = "David";
}
void changeName1(Person * person)
{
person->name = "Frank";
}
int main()
{
Person p = {"Unknown"};
changeName(p);
std::cout << "After changeName: name = " << p.name << std::endl;
changeName1(&p);
std::cout << "After changeName1: name = " << p.name << std::endl;
return 0;
}
可以發(fā)現(xiàn)使用引用參數(shù),在調(diào)用的時(shí)候方便一些奸绷,直接傳入變量名即可梗夸,而不用傳入變量的地址。這也是C++對(duì)C指針改進(jìn)的一個(gè)地方号醉。
引用參數(shù)的注意事項(xiàng)
聲明引用參數(shù)時(shí)反症,只有一個(gè)注意事項(xiàng): 如果沒(méi)有絕對(duì)的理由需要修改原始數(shù)據(jù),那么就將引用參數(shù)設(shè)置為 const 畔派。
否則可能會(huì)觸發(fā)一些編譯問(wèn)題(例如傳入變量類型不匹配铅碍,導(dǎo)致編譯不過(guò))或使用問(wèn)題(例如無(wú)意間修改了原始數(shù)據(jù))。
將引用用于函數(shù)返回類型
如果函數(shù)返回一個(gè)引用類型的變量线椰,要注意不要將返回的引用變量指向不存在的內(nèi)存
Person & changeName(Person & p)
{
Person temp;
p.name = "David"; // 修改原始數(shù)據(jù)
temp = p; // 拷貝信息
return temp;
}
temp 變量的內(nèi)存在函數(shù)結(jié)束后胞谈,會(huì)被釋放,因此返回 temp 變量的引用將會(huì)指向一個(gè)無(wú)效內(nèi)存憨愉,這將導(dǎo)致編譯錯(cuò)誤烦绳。
如果函數(shù)必須返回一個(gè)引用類型的變量,可以將傳入的引用參數(shù)返回
Person & changeName(Person & p)
{
p.name = "david";
// 返回引用參數(shù)配紫,安全
return p;
}
什么時(shí)候使用引用
指針和引用都有兩個(gè)作用
- 可以修改原始數(shù)據(jù)径密。
- 引用參數(shù)或指針參數(shù),可以提高程序的運(yùn)行速度躺孝。因?yàn)樗鼈兌疾粓?zhí)行數(shù)據(jù)復(fù)制操作享扔。
那么什么使用引用參數(shù)底桂,什么時(shí)候使用指針?
一個(gè)原則: 在C++中惧眠,如果函數(shù)要修改參數(shù)的原始數(shù)據(jù)籽懦,就使用引用。