1. 程式人生 > >c++入門之引用

c++入門之引用

引用通常被用在函式形參傳遞的過程中。一般的引數傳遞的過程:將實參進行拷貝,函式中都是對拷貝的變數進行操作,而不是對原變數進行操作。但很多情況下,我們都希望對原變數進行操作.(比如交換兩個變數的數值)。下面先給出一段程式碼:

 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型別

free_throws &accmulate(par1,par2)函式中的par1是被修改的,而par2是右值,因此定義成了const。但這個函式有趣的地方在於,幫我們重新認識了函式:思考什麼是函式?

        從組成結構上講,函式包括了這幾個點:函式名(函式的入口地址),函式形參型別及個數,函式的返回值型別(函式名前面的東西)。當每次遇到函式的時候,我們腦海裡要形成對這三個屬性的認識:函式名代表什麼,函式的形參可以是什麼型別?可以有多少個?返回值是什麼型別??可以有多少個?

我們關注這個函式的返回值,發現,並不是我們熟悉的Int ,char ,double ,甚至是指標比如int *。這裡返回的是結構體,確切的說是結構體引用。比如我們說指標型別的時候,我們會說int*.因此,我們需要將引用看成一個型別。這裡是structname  &型別。而我們發現,target變數自身就是structname  &型別。我們發現,這是吻合的,其實仔細思考原來的,int ,char ,double 甚至指標,函式中被返回的變數的型別。和函式名前的返回型別是一致的!!!