1. 程式人生 > >c++成員函式的儲存

c++成員函式的儲存

用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。

按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件的資料和函式程式碼分配儲存單元,如圖8.4所示。


圖8.4 能否只用一段空間來存放這個共同的函式程式碼段,在呼叫各物件的函式時,都去呼叫這個公用的函式程式碼。如圖8.5所示。


圖8.5
顯然,這樣做會大大節約儲存空間。C++編譯系統正是這樣做的,因此每個物件所佔用的儲存空間只是該物件的資料部分所佔用的儲存空間,而不包括函式程式碼所佔用的儲存空間。如果聲明瞭一個類:
  1. classTime
  2. {
  3. public:
  4. int
    hour;
  5. int minute;
  6. int sec;
  7. void set( )
  8. {
  9. cin>>a>>b>>c;
  10. }
  11. };
可以用下面的語句來輸出該類物件所佔用的位元組數:
    cout<<sizeof(Time)<<endl;
輸出的值是12。

這就證明了一個物件所佔的空間大小隻取決於該物件中資料成員所佔的空間,而與成員函式無關。

函式程式碼是儲存在物件空間之外的。如果對同一個類定義了10個物件,這些物件的成員函式對應的是同一個函式程式碼段,而不是10個不同的函式程式碼段。需要注意的是,雖然呼叫不同物件的成員函式時都是執行同一段函式程式碼,但是執行結果一般是不相同的。


不同的物件使用的是同一個函式程式碼段,它怎麼能夠分別對不同物件中的資料進行操作呢?

原來C++為此專門設立了一個名為this的指標,用來指向不同的物件。需要說明:
  1. 不論成員函式在類內定義還是在類外定義,成員函式的程式碼段都用同一種方式儲存。
  2. 不要將成員函式的這種儲存方式和inMne(內建)函式的概念混淆。不要誤以為用inline宣告(或預設為inline)的成員函式,其程式碼段佔用物件的儲存空間,而不用 inline宣告的成員函式,其程式碼段不佔用物件的儲存空間。不論是否用inline宣告,成員函式的程式碼段都不佔用物件的儲存空間。用inline宣告的作用是在呼叫該函式時,將函式的程式碼段複製插人到函式呼叫點,而若不用inline宣告,在呼叫該函式時,流程轉去函式程式碼段的人口地址,在執行完該函式程式碼段後,流程返回函式呼叫點。inline與成員函式是否佔用物件的儲存空間無關,它們不屬同一個問題,不應搞混。
  3. 應當說明,常說的“某某物件的成員函式”,是從邏輯的角度而言的,而成員函式的儲存方式,是從物理的角度而言的,二者是不矛盾的。

相關推薦

c++成員函式儲存方式

轉自:點選開啟連結 用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。 按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件的資料和函式程式碼分配儲存單元,如圖8.4所示。 圖8.

c++成員函式儲存

用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。 按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件的資料和函式程式碼分配儲存單元,如圖8.4所示。 圖8.4 能否只用一段空間來存放這個共同的函式程式碼段,在呼叫各物件的

C++成員函式在記憶體中的儲存方式

        用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件

c++ 成員函式尾遞迴

#include <iostream> int factorial_tail(int n, int first, int second) { if (n == 1) { return second; } else {

c++成員函式後面加一個冒號的含義

轉載自:https://zhidao.baidu.com/question/2010930169328038188.html 冒號後面跟的是賦值,這種寫法是C++的特性。 A( int aa, int bb ):a(aa),b(bb) { } 相當於 A( int aa,

利用Thunk讓C++成員函式變回調函式

Windows API經常需要回調函式,而在C++開發中面向物件當行其道,若能讓C++類的成員函式成為回撥函式,簡直就是大善!但是C++成員函式都隱含了一個this指標用於指向當前的物件。要實現回撥確實不容易。 我大約一年前就接觸到Thunk技術,甚至也看過利用Thunk實現將成員函式變成回撥函式的例子。但

[C++]成員函式的過載(overload)、覆蓋(override)和隱藏(hide)

C++成員函式的過載、覆蓋和隱藏 1. 過載與覆蓋 成員函式被過載的特徵是: 具有相同的作用域(即同一個類定義中); 函式名字相同; 引數型別、順序或數目不同(包括); virtual 關鍵字可有可無。 覆蓋是指派生類重新實現(或者改寫)了基

c++ 成員函式的過載、覆蓋與隱藏

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚 概念,否則錯誤將防不勝防。 8.2.1 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同;

C++成員函式的過載、覆蓋與隱藏

 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 成員函式被過載的特徵:(1)相同的範圍(在同一個類中);(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。 覆蓋:派生類函式覆蓋基類函式

瞭解c++成員函式呼叫以及引用

成員函式指標 我一直有點困惑在c++的類中並不包含成員函式,比如 class A{ public: void a(){cout<<"a";} void b(){} void c(){} }; sizeof(A)=

C++ 成員函式成員變數的關係

在C++中, #include <iostream> using namespace std; struct Data{ int x = 10; int y() { return 20; } }; int main

c++成員函式指標typedef

A tutorial on a useful yet poorly understood language feature,useful to cache the outcome of a decision or to enable a different sort ofpo

C++】C++成員函式後面跟冒號冒號

/* node class definition*/ class Node { public: int data; // data Node *parent; Node *left; N

C++成員函式作為回撥函式的問題

1. 程式設計分兩類 一,應用程式設計和系統程式設計 系統程式設計就是編寫底層的庫, 應用程式設計就是利用已經編寫好的庫的介面來編寫某種具有某些功能的程式,即應用 所謂的庫,就是為了給應用提

C++----類的成員變數和成員函式在類的儲存方式

類的成員變數和成員函式在類的儲存方式為分開儲存。 即只有非靜態變數儲存在類中,其餘的所有成員均不在類中。 實驗如下: exp1: class Person1 { }; void test01() { cout << "size of (空類Person)

C++:如何判斷類中是否存在特定的成員函式

       在模板開發中有時需要判斷一個類中是否含特定的方法,然後根據判斷結果開分支,編寫不同的邏輯。下面就介紹一下最常用的一種方式: template <typename U> struct class_str {

C++過載(2):通過成員函式和友元函式過載

分別通過成員函式和友元函式完成過載 #include <iostream> using namespace std; class Complex { public: Complex(double real =0,double imag=0):real(real),imag(i

4、【C++】靜態成員變數/靜態成員函式/行內函數/友元函式/友元類/友元成員函式

一、靜態成員     我們可以使用 static 關鍵字來把類成員定義為靜態的。當我們宣告類的成員為靜態時,這意味著無論建立多少個類的物件,靜態成員都只有一個副本。     靜態成員在類的所有物件中是共享的。如果不存在其他的初始化語句,在建立第一個物件時,所有的靜態資料都會被初始化為

c++學習筆記之成員函式

學了c++才知道什麼是面向物件什麼是面向過程。幼稚的我曾經還覺得c++和C語言差不多,接觸之後才知道c++是多麼的難,光類和物件這個知識點就看了一天。什麼建構函式解構函式,物件陣列物件成員弄得我頭大,現在才知道為什麼老師說c++是最難的語言,學c++就是在地獄裡磨鍊,從地獄出來就是天堂,會有會當凌絕

C++中一個類訪問另外一個類的成員變數或者成員函式

1.在一個類中定義另外一個類的成員為指標型別。並用this指標管理物件的記憶體,實現資料的傳遞。 #include <stdio.h> class A { public: A(); ~A(); void SetData(int year, int month, int day);