程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++學習筆記之——內聯函數,引用,學習筆記內聯

C++學習筆記之——內聯函數,引用,學習筆記內聯

編輯:C++入門知識

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;

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,這樣在函數中兩個值互相交換,便可以修改原來的值。按值傳遞時只是對傳遞過來的副本進行交換,並沒有改變原來的值,所以沒有交換成功。

最後進行一下總結:

使用引用的原因:

  • 程序員能夠修改調用函數中的數據對象
  • 通過傳遞引用而不是傳遞整個數據對象,可以提高運行速度,這一點也是指針參數存在的一個原因

下面是一些指導原則:
使用傳遞的值而不對原始值做修改的函數:

  • 數據對象很小,則按值傳遞
  • 數據對象是數組,使用指針(別無選擇)並且將指針聲明為指向const的指針
  • 數據結構較大時,使用const指針或者const引用
  • 數據對象是類對象,使用const引用

使用傳遞的值並且對原始值做修改的函數:

  • 數據對象是內置數據類型,使用指針
  • 數據對象是數組,使用指針
  • 數據對象是結構,使用指針或者引用
  • 數據對象是類結構,使用引用

     

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved