程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Effective C++筆記之一:const 、enum、inline 代替#define的小結

Effective C++筆記之一:const 、enum、inline 代替#define的小結

編輯:C++入門知識

 

我已經學完了C++了, 但是這學期好像沒有學到什麼東西,覺得C++我還沒有入門,我想通過記筆記的形式再來學習C++,其中會有我個人對於C++的想法和不懂的地方我都會寫在這裡(希望高手能幫我解決不懂的地方和指出我錯誤的地方,謝謝),今天寫第一篇,我應該每天都會寫一篇的。

 

一:const、enum 、inline 的用法總結:

 

在用於替換不帶參數的#define 是請用const 和enum 不僅是因為比#define 的安全性要高(會進行類型檢查),而#define 定義的宏沒有參數類型,只是簡單的替換,而且const可用於任何的作用域的對象、函數參數、函數的返回值類型、成員函數體(可以達到防止用戶修改的目的).如果在有參數的時候請用inline 代替帶參數的宏(可以避免歧義,和一些錯誤).  對於const 修飾的變量可用一句話來表示"近水樓台先得月(變量的數據類型不看)"

有趣的是既然你上面這麼說的,好我就這樣做

eg0:

const char* str = "Name" ;     //把char不看說明const修飾的是*str(指向常量的指針也就是說*str的內容不能變,但是它的地址可以變

str[0] = 'F'                                      //false

str = "Fame"                                 //true

而:

char* const str = "Name"    //把char不看說明const修飾的是str(常指針),內容可以變,但是地址不能變

char* const str = "Name" ;  //常指針

str[0] = 'F' ;                         //沒有語法錯誤完全通過但是會出現數據沖突

                                           // Unhandled exception at 0x00d914d8 in Test.exe: 0xC0000005: Access violation writing  location 0x00d97838.這是由於什麼引起的???

 

但是我用new 來給str分配5個空間再逐個賦值卻沒有問題,這是怎麼回事???

char * const str = new char[5] ;

str[0] = 'F' ;

str[1] = 'a' ;

str[2] = 'm' ;

str[3] = 'e' ;

str[4] = '\0' ;

這時候str輸出為: Fame(知道原因的請告訴我,謝謝)

用const比#define 要好

eg1:

#define MAX 5               //可用下面

const int cmax = 5 ;       //替換(編譯器在編譯時會進行類型檢查)

 

若在class的申明內,而不能在聲明內定義類型的初始值,但是卻要確定數組的大小時,可用enum 或static const 來代替#define .

 eg2:

class CGamePlayers

{     

private:      

     enum { NumTurns = 5} ;             

     int m_Scores[NumTurns] ;

 };

或者

class CGamePlayers

{    

   private:   

          static const int NumTurns = 5 ;        //聲明變量NumTurns,注意static 不能少,因為static 申明的變量在編譯的

                                                                   // 時候就確定其大小,不然的話下面的這句就會出錯             

          int m_Scores[NumTurns] ;

} ;

const int CGamePlayers::NumTurns  ;       //不能在定義其大小,因為NumTurn的大小為5不能變了。

 

 用inline代替帶參數的宏,效率也很高

 eg3:

#define CALL_WITH_MAX(lhs , rhs)        Fn((lhs) > (rhs) ? (lhs) : (rhs))                 //假設函數Fn已定義, 記得帶上"()"

int lhs = 5 , rhs = 0 ;

CALL_WITH_MAX(++lhs , rhs) ;          //a被累加兩次輸出lhs = 7

CALL_WITH_MAX(++lhs , rhs+10) ;    //a被累加一次輸出lhs = 6

不信你去試一下!!為什麼當第一個參數大於第二個參數的時候lhs會自增兩次,反之lhs卻自增一次,我沒有明白(我以為在lhs > rhs 的時候他會調用Fn 函數兩次,其實兩個語句都是調用一次,但是為什麼lhs的自增次數會受到rhs大小的影響我沒有弄懂(知道的多謝指教)

若用inline卻不存在這樣有歧義的語句

template<typename T>

inline void Call_With_Max(const T& lhs , const T& rhs)

      Fn(lhs > rhs ? lhs : rhs) ;    //假設Fn函數已定義

}

再調用函數的那邊lhs的值兩次都是6.(符合我們的正常思維)。   

 


摘自 Cql_liliang‘s Blog

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