本文為原創作品,轉載請注明出處
歡迎關注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/
作者:晨凫追風
一直想開始寫C++的學習筆記,學習C++已經兩個月了,今天開始寫一下引用,內聯函數,的一些概念和作用吧。那麼開始吧!
我們寫的程序最終都是要用編譯器,進行編譯鏈接形成一段機器可以知道的二進制代碼,接著存到一個內存中,這時候每一段程序代碼都會有自己的一個地址,計算機按照地址增1,依次執行這段代碼,當遇到代碼調用別的函數的時候,這時候就要存儲目前程序執行的很多狀態呀,把這些東西放入堆棧裡面,然後去執行被調用的函數,執行完之後再返回原來的程序斷點處繼續執行。這樣一來一去,就會浪費時間和一些內存。於是內聯函數出現了,它就是在編譯器對代碼進行鏈接的階段,在調用函數的位置,用調用的函數代碼替換原來的函數調用,這樣就不用調用來調用去,占去時間和內存。如果你的程序中有十個位置調用了內聯函數,則這個函數將會在整個代碼中存在十個副本。看圖說話:
要用到內聯函數要采取下列兩個措施之一:
最常見的用法是定義函數和聲明時一起來,
上代碼;
#include<iostream>
using namespace std;
inline double square(double x) {return x * x; }
int main()
{
double a, b;
double c = 11.0;
a = square(5.0);
b = square(4.5 + 7.5);
cout <<"a = "<< a<< endl;
cout <<" b = "<< b <<endl;
cout<<"square(C++) = " << square(c++) <<endl;
cout<<"now c = " <<c<< endl;
}
內聯函數總結:
內聯函數就是為了省去函數調用占用的一些時間和內存而出現的,當一些函數比較長時用內聯函數顯然不具有很大意義,執行時間遠大於調用耗去的時間,所以一般情況下,如果函數定義超過多行時不太用內聯函數,而且內聯函數是不允許遞歸的。
如果一個人叫"阿貓"它的小名叫"阿狗",這時你喊"阿貓"或者"阿狗"大家都明白是它,於是呢當你打"阿貓"時,"阿狗"也會受傷(同一個人)。引用就是這樣的,同一個變量叫兩個名字,你修改一個名叫"阿貓"的變量後,叫"阿狗"的肯定也變了。(記住無論在哪裡改它,他們總是一起改變,從一而終)。
舉個例子:把int變量firstName取小名lastName;
int firstName;
int & lastName = firstName;
取好名字之後兩名字便一直依存。纏纏綿綿。開始了他和他的故事:
注意:必須在聲明引用變量的時候對引用變量進行初始化。如下面:
int first Name;
int & lastName;
lastName = firstName; 不可以 。。。。不可以 。。。。。不可以。。。。
引用變量有啥用呢?
函數按值傳遞調用過程中,修改形參,相應的實參是不會改變的,因為在調用的過程中先是拷貝那個傳遞過來的值,然後用這個副本進行處理。這樣被調用程序就不會訪問調用程序中的那個變量。
按值傳遞調用遇到大的結構體,復制一下,再用副本這樣會占用時間,於是來一個按引用變量傳遞調用函數。這樣相當於直接對原始的那個值進行操作。Ok不用復制,當然你也可以用指針對其進行訪問,有同樣的效果,就是指針用的不太明白,按照引用調用的話,只需按照按值傳遞調用那樣調用程序就好了。
按照指針調用的話,是對指針進行復制,然後用復制的副本進行一系列的操作。
舉個簡單的例子:
#include<iostream>
using namespace std ;
void swapr(int &a, int &b); //按照引用傳遞進行調用
void swapp(int * p, int * q); //按照指針傳遞進行調用
void swapv(int a ,int b); //按值傳遞進行調用
int main()
{
int wallet1 = 100;
int wallet2 = 200;
cout << "wallet1 = " << wallet1 <<endl;
cout << "wallet2 = " << wallet2 <<endl;
cout << "引用傳遞"<< endl;
swapr(wallet1,wallet2);
cout << "wallet1 = " << wallet1 <<endl;
cout << "wallet2 = " << wallet2 <<endl;
cout << "指針傳遞"<< endl;
swapp(&wallet1, &wallet2);
cout << "wallet1 = " << wallet1 <<endl;
cout << "wallet2 = " << wallet2 <<endl;
cout << "按值傳遞"<< endl;
swapv(wallet1,wallet2);
cout << "wallet1 = " << wallet1 <<endl;
cout << "wallet2 = " << wallet2 <<endl;
}
void swapr(int &a, int &b) //按照引用傳遞進行調用
{
int temp ;
temp = a;
a = b;
b = temp;
}
void swapp(int * p, int * q) //按照指針傳遞進行調用
{
int temp ;
temp = *p;
*p = *q;
*q = temp;
}
void swapv(int a ,int b) //按值傳遞進行調用
{
int temp ;
temp = a;
a = b;
b = temp;
}
分析下程序:
在按照引用傳遞進行函數調用的時候,把wallet1的引用指定為a,wallet2的引用指定為b,這樣在函數中兩個值互相交換,便可以修改原來的值。按值傳遞時只是對傳遞過來的副本進行交換,並沒有改變原來的值,所以沒有交換成功。
最後進行一下總結:
使用引用的原因:
下面是一些指導原則:
使用傳遞的值而不對原始值做修改的函數:
使用傳遞的值並且對原始值做修改的函數: