程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 用匯編的眼光看C++(之const屬性)

用匯編的眼光看C++(之const屬性)

編輯:C++入門知識

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱:feixiaoxing @163.com】

 

 

 

 

    const是C/C++語言中的關鍵字,但是如果用的好,可以極大地提高代碼的健壯性。一般來說const使用的地方還是蠻多的,但是主要還是下面幾個地方:(1)普通變量的保護;(2)地址空間的保護;(3)類初始變量的聲明和保護;(4)類變量在函數中的保護。const的保護主要來自於編譯器層面,和程序的運行沒有關系。

 

    (1)普通變量的保護

 

 

const int data = 10; 

const char str = 'a'; 

const double pi = 3.14; 

const int data = 10;

const char str = 'a';

const double pi = 3.14;

    上面的代碼就是一組全局變量的定義,如果在函數中變量發生了修改,那麼代碼就會編譯失敗。

 

 

 

    (2)地址空間的保護

 

 

void process() 

    int value = 10; 

    const int* address = &value; 

void process()

{

       int value = 10;

       const int* address = &value;

}

    和上面代碼不一樣的地方就是,這裡如果address地址指向的數值發生了改變,那麼那麼代碼就會編譯失敗?大家可以在函數結束前添加*address = 100;試試看?

 

 

 

    (3)類const成員變量的定義

 

 

class desk 

    const int price; 

public: 

    desk():price(10){} 

    ~desk() {} 

}; 

class desk

{

       const int price;

public:

       desk():price(10){}

       ~desk() {}

};    const成員變量 就是在類變量定義的時候前面添加const關鍵字。和普通的成員變量不一樣,const變量在構造函數中一定要初始化操作的。如果沒有const關鍵字,那麼在構造函數內部就無所謂是不是需要初始化了。

 

 

 

     (4)類const函數

 

 

class desk 

    int price; 

public: 

    desk() {} 

    ~desk() {} 

    void print() {return;} 

    void print() const {return;} 

}; 

class desk

{

       int price;

public:

       desk() {}

       ~desk() {}

       void print() {return;}

       void print() const {return;}

};    那麼desk裡面的print和print() const函數是不是一樣的呢?大家可以看一下這個代碼:

 

53:       desk m; 

0040122D   lea         ecx,[ebp-10h] 

00401230   call        @ILT+75(desk::desk) (00401050) 

00401235   mov         dword ptr [ebp-4],0 

54:       m.print(); 

0040123C   lea         ecx,[ebp-10h] 

0040123F   call        @ILT+70(desk::print) (0040104b) 

55:       const desk n; 

00401244   lea         ecx,[ebp-14h] 

00401247   call        @ILT+75(desk::desk) (00401050) 

0040124C   mov         byte ptr [ebp-4],1 

56:       n.print(); 

00401250   lea         ecx,[ebp-14h] 

00401253   call        @ILT+65(desk::print) (00401046) 

57:   } 

53:       desk m;

0040122D   lea         ecx,[ebp-10h]

00401230   call        @ILT+75(desk::desk) (00401050)

00401235   mov         dword ptr [ebp-4],0

54:       m.print();

0040123C   lea         ecx,[ebp-10h]

0040123F   call        @ILT+70(desk::print) (0040104b)

55:       const desk n;

00401244   lea         ecx,[ebp-14h]

00401247   call        @ILT+75(desk::desk) (00401050)

0040124C   mov         byte ptr [ebp-4],1

56:       n.print();

00401250   lea         ecx,[ebp-14h]

00401253   call        @ILT+65(desk::print) (00401046)

57:   }

    上面是一段函數調用的代碼。我們在53行和55行定義了desk類型的變量m和n。接著在54行和56行,我們分別利用兩個變量調用print函數進行處理,我們發現兩個調用的函數地址並不一樣,其中一個是0x0040104b,另外一個是0x00401046,我們可以繼續跟進去看一下:

 

00401046   jmp         desk::print (00401310) 

0040104B   jmp         desk::print (004012e0) 

00401046   jmp         desk::print (00401310)

0040104B   jmp         desk::print (004012e0)

    這裡雖然是兩個跳轉函數,但是事實已經證明這裡的兩個函數確實是不一樣的,這也證明了我們的判斷是正確的。

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