條款2:盡量以const,enum,inline替換#define

來源:互聯網
上載者:User

這一條款也被稱作:寧可用編譯器替換前置處理器。從以下幾方面說明:(最開始的那一段似乎跟編譯原理有關,我是不懂的,就不說了):

對於一般用#defined定義的常量,可以使用const類型代替。

但是要注意兩種特殊情況:假如我們要在標頭檔中定義一個不能被修改的字串,那麼需要使用const char* const類型的指標:

char a = 'A';char b = 'B';char* const pa1 = &b;//pa1 = &a;表明指標的指向不能變*pa1 = 'C';//可以改變指標指向對象的值const char* pa2 = &a;//*pa2 = 'B';指標指向的對象是常量,不能修改pa2 = &b;//可以改變指標的指向const char* const cptr = "const";//此時,不論是指標的指向還是指標指向的對象值都不能修改

第二種情況是與類有關的。你無法通過#define來確定一個有範圍的常數,但是可以用static const來完成。比如你定義了數組長度為5,可以這樣做。在標頭檔中:

class Test{private://記錄整個所有Test類型對象調用fun函數的次數static int times;//數組的長度static const int arraySize = 5;public:void fun(){std::cout<<++times<<std::endl;}int Array[arraySize];};

這裡還有static int times變數的原因是因為它們的聲明、定義完全不同!在對應的源檔案中,只有

#include "item2.h"int Test::times = 0;//const int Test::arraySize;

也就是說,對於一般的staic變數(這裡是times),是在標頭檔中聲明它是static,而在源檔案中定義的;而對於static const變數,假如這個變數是“整數”類型:int,char,bool,那麼直接就可以直接聲明,而不用定義。

#define除了定義一些常量之外,使用#define定義宏,也可以節省函數調用的開銷:

#define FIND_MAX_VALUE(a,b) (a) > (b) ? (a) : (b)

然後就可以:

int a = 10,b = 5;int c = FIND_MAX_VALUE(a,b);

但是這樣做有一個致命的問題:
int c = FIND_MAX_VALUE(++a,b);後c為12;而int c = FIND_MAX_VALUE(++a,b+10);後c為11!這是一件多麼令人驚奇的事啊!所以,為了防止出現這種亂子,c++提供了內嵌函式,這種函數在調用時,會在調用點展開,開銷比較小。

簡而言之:如果是#define常量,用const替換;如果是為了定義類似函數的宏,則用內嵌函式替換。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.