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 甚至指針,函數中被返回的變量的類型。和函數名前的返回類型是一致的!!!

4  引用必須在定義的時候進行初始化,函數傳參也屬於這一種情況。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM