引用通常被用在函數形參傳遞的過程中。一般的參數傳遞的過程:將實參進行拷貝,函數中都是對拷貝的變量進行操作,而不是對原變量進行操作。但很多情況下,我們都希望對原變量進行操作.(比如交換兩個變量的數值)。下面先給出一段代碼:
1 #include "iostream" 2 #include "string" 3 using std::string; 4 using std::cout; 5 struct free_throws{ 6 string name; 7 int made; 8 int attempts; 9 float percent; 10 }; 11 12 void display(const free_throws &ft); 13 void set_pc(free_throws &ft); 14 free_throws& accmulate(free_throws &target, const free_throws &source); 15 16 int main() 17 { 18 free_throws one{ "alice", 13, 14 }; 19 free_throws two{ "jack", 10, 16 }; 20 free_throws three{ "robot", 7, 9 }; 21 free_throws four{ "lucy", 5,9 }; 22 free_throws five{ "jeff", 6, 14 }; 23 free_throws team{ "lee", 0, 0}; 24 free_throws dup; 25 set_pc(one); 26 display(one); 27 accmulate(team, one); 28 display(team); 29 display(accmulate(team, two)); 30 accmulate(accmulate(team, three), four); 31 display(team); 32 system("pause"); 33 return 0; 34 } 35 36 void set_pc(free_throws &ft) 37 { 38 if (ft.attempts != 0) 39 ft.percent = 100.0f*float(ft.made) / float(ft.attempts); 40 else 41 ft.percent = 0; 42 } 43 void display(const free_throws &ft) 44 { 45 cout << "name:" << ft.name << "\n"; 46 cout << "made" << ft.made << "\t"; 47 cout << "attempts" << ft.attempts << "\t"; 48 cout << "attempts" << ft.percent << "\t"; 49 } 50 51 free_throws &accmulate(free_throws &target, const free_throws &source) 52 { 53 target.attempts += source.attempts; 54 target.made = source.made; 55 set_pc(target); 56 return target; 57 }
上述代碼:描述了引用變量在結構體中的應用,實際上,應用引用變量的地方多在較為復雜的數據結構中。
1.set_pc()的功能是修改結構體成員值(如果我們不采用引用變量,那么修改的將是拷貝的變量,而非原變量,當然我們也可以采用指針的方式)
2.display()的作用是顯示結構體成員值,需要注意的是:這個程序的功能是顯示結構體成員的值,也就是不對結構體成員作修改。因此引入了const 限定。const表明如果我們試圖在函數函數中修改形參(這里是ft,也就是被傳遞的結構體,如one),那么就會出錯。.
關於const的基本性質和原理不再贅述。說明一點:當要被傳遞的參數作為右值時(不被修改),為了程序的健壯性,通常我們會將參數設置為const類型
3 free_throws &accmulate(par1,par2)函數中的par1是被修改的,而par2是右值,因此定義成了const。但這個函數有趣的地方在於,幫我們重新認識了函數:思考什么是函數?
從組成結構上講,函數包括了這幾個點:函數名(函數的入口地址),函數形參類型及個數,函數的返回值類型(函數名前面的東西)。當每次遇到函數的時候,我們腦海里要形成對這三個屬性的認識:函數名代表什么,函數的形參可以是什么類型?可以有多少個?返回值是什么類型??可以有多少個?
我們關注這個函數的返回值,發現,並不是我們熟悉的Int ,char ,double ,甚至是指針比如int *。這里返回的是結構體,確切的說是結構體引用。比如我們說指針類型的時候,我們會說int*.因此,我們需要將引用看成一個類型。這里是structname &類型。而我們發現,target變量自身就是structname &類型。我們發現,這是吻合的,其實仔細思考原來的,int ,char ,double 甚至指針,函數中被返回的變量的類型。和函數名前的返回類型是一致的!!!
4 引用必須在定義的時候進行初始化,函數傳參也屬於這一種情況。
