c++成員函數的存儲方式---11


原創博客:轉載請標明出處:http://www.cnblogs.com/zxouxuewei/

 

成員函數屬於一個類的成員,出現再類體中。可以被指定為公有,私有或受保護的。

1.在類外面定義成員函數時,需要用類名加作用域限定符(::),如下代碼:

#include <iostream>
#include <string>
using namespace std;

class _test_myclass
{
public:
    void display(const int &value);  //在類內聲明成員函數
}class1;

void _test_myclass::display(const int &value) //在類外定義成員函數,用作用域操作符
{
    cout << "value is "<<value<<endl;
}

int main(int argc,const char* argv)
{

    class1.display(100);
    return 0;
}

2.inline成員函數

inline成員函數為內斂函數(也叫內置函數),在類內定義的成員函數可以不用加inline關鍵字。因為類內成員函數默認為內置函數。

#include <iostream>
#include <string>
using namespace std;

class _test_myclass
{
public:
    void display(const int &value)   //類內成員函數無需添加inline關鍵字
    {
        cout << "value is "<<value<<endl;
    }

}class1;

inline void display2(const int &value)   //聲明為內置函數
{
   cout << "value is "<<value<<endl;
}

int main(int argc,const char* argv)
{

    display2(100);
    return 0;
}

3.成員函數的存儲方式

用類去定義對象時,系統會為每一個對象分配存儲空間。如果一個類包括了數據和函數,要分別為數據和函數的代碼分配存儲空間。

按理說,如果用同一個類定義了10個對象,那么就需要分別為10個對象的數據和函數代碼分配存儲單元,如圖8.4所示。

圖8.4

能否只用一段空間來存放這個共同的函數代碼段,在調用各對象的函數時,都去調用這個公用的函數代碼。如圖8.5所示。

圖8.5

顯然,這樣做會大大節約存儲空間。C++編譯系統正是這樣做的,因此每個對象所占用的存儲空間只是該對象的數據部分所占用的存儲空間,而不包括函數代碼所占用的存儲空間。如果聲明了一個類:

class Time
{
  public:
  int hour;
  int minute;
  int sec;
  void set( )
  {
      cin>>a>>b>>c;
  }
};

可以用下面的語句來輸出該類對象所占用的字節數:

  cout<<sizeof(Time)<<endl;

輸出的值是12。

這就證明了一個對象所占的空間大小只取決於該對象中數據成員所占的空間,而與成員函數無關。

函數代碼是存儲在對象空間之外的。如果對同一個類定義了10個對象,這些對象的成員函數對應的是同一個函數代碼段,而不是10個不同的函數代碼段。需要注意的是: 雖然調用不同對象的成員函數時都是執行同一段函數代碼,但是執行結果一般是不相同的。

不同的對象使用的是同一個函數代碼段,它怎么能夠分別對不同對象中的數據進行操作呢?
原來C++為此專門設立了一個名為this的指針,用來指向不同的對象。需要說明:
不論成員函數在類內定義還是在類外定義,成員函數的代碼段都用同一種方式存儲。
不要將成員函數的這種存儲方式和inline(內置)函數的概念混淆。
應當說明: 常說的“某某對象的成員函數”,是從邏輯的角度而言的,而成員函數的存儲方式,是從物理的角度而言的,二者是不矛盾的。

 


免責聲明!

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



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