C++学习笔记之——引用 内联函数
本文為原創作品,轉載請注明出處
歡迎關注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/
作者:晨鳧追風
一直想開始寫C++的學習筆記,學習C++已經兩個月了,今天開始寫一下引用,內聯函數,的一些概念和作用吧。那么開始吧!
????內聯函數:
?我們寫的程序最終都是要用編譯器,進行編譯鏈接形成一段機器可以知道的二進制代碼,接著存到一個內存中,這時候每一段程序代碼都會有自己的一個地址,計算機按照地址增1,依次執行這段代碼,當遇到代碼調用別的函數的時候,這時候就要存儲目前程序執行的很多狀態呀,把這些東西放入堆棧里面,然后去執行被調用的函數,執行完之后再返回原來的程序斷點處繼續執行。這樣一來一去,就會浪費時間和一些內存。于是內聯函數出現了,它就是在編譯器對代碼進行鏈接的階段,在調用函數的位置,用調用的函數代碼替換原來的函數調用,這樣就不用調用來調用去,占去時間和內存。如果你的程序中有十個位置調用了內聯函數,則這個函數將會在整個代碼中存在十個副本。看圖說話:
要用到內聯函數要采取下列兩個措施之一:
-
在函數聲明前加關鍵字inline
-
在函數定義前加關鍵字inline
最常見的用法是定義函數和聲明時一起來,
上代碼;
#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;
intfirstName;
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,這樣在函數中兩個值互相交換,便可以修改原來的值。按值傳遞時只是對傳遞過來的副本進行交換,并沒有改變原來的值,所以沒有交換成功。
最后進行一下總結:
使用引用的原因:
-
程序員能夠修改調用函數中的數據對象
-
通過傳遞引用而不是傳遞整個數據對象,可以提高運行速度,這一點也是指針參數存在的一個原因
下面是一些指導原則:
使用傳遞的值而不對原始值做修改的函數:
-
數據對象很小,則按值傳遞
-
數據對象是數組,使用指針(別無選擇)并且將指針聲明為指向const的指針
-
數據結構較大時,使用const指針或者const引用
-
數據對象是類對象,使用const引用
使用傳遞的值并且對原始值做修改的函數:
-
數據對象是內置數據類型,使用指針
-
數據對象是數組,使用指針
-
數據對象是結構,使用指針或者引用
-
數據對象是類結構,使用引用
?
?
?
?
總結
以上是生活随笔為你收集整理的C++学习笔记之——引用 内联函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python html压缩包,用pyth
- 下一篇: 手机html滚动原理,手机滚动-如何实现