我已經學完了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.(符合我們的正常思維)。