我所知道的乙個簡單類
大家都說c++難學,我也正在學習,之所以難是可能因為沒有了解c++中的一些很基礎的東西,有點似懂非懂的感覺,而沒有真正了解c++的執行機制,我一直在學習基礎,這篇部落格源於乙個簡單的類,這就是我所知道的乙個簡單類,部落格中的觀點大部分來至effective c++和more effective c++兩本書,我是反覆看了好幾遍,還會一直看,因為我的c++還很菜。
乙個簡單的類原始碼:
#includeusing
namespace std;
class uint
//這個建構函式可以把int型別隱式轉換成uint型別
//兩種函式允許編譯器進行型別轉換:但引數建構函式和隱式型別轉換運算子
uint(const
int& i):val(i)
//其他的型別可以賦值給uint型別,當然該報錯的還是得報錯(如你傳入乙個string型別),總比秘密做了很多你不想要的好吧
template
uint& operator=(const t& i)
//取址運算子
uint* operator&()
//返回型別是乙個常量指標,也就是說接收這個方法返回值的變數必須為常量指標
//這是乙個常量方法,所以不能修改成員變數的值
const uint* operator&() const
//返回當前物件的引用,當然你就可以對他進行任何合法的操作
//返回型別為引用型別或者指標型別就不會有臨時變數的構造和析構
uint& operator++()
//返回的是乙個區域性變數,你對區域性變數的任何操作都是沒有意義的,所以返回型別為const
//大家都知道區域性變數在超出他的作用域之後會自動析構,現在卻返回乙個區域性變數,這裡其實產生了乙個臨時變數,用oldval初始化臨時變數,
//若沒有變數接收當前方法的返回值,方法呼叫完成之後,臨時變數會自動析構,
//若有變數接收當前方法的返回值,臨時變數在該變數自動析構之前析構,在棧中先定義後析構,這就是傳說中的先進後出!
const uint operator++(int)
//加法運算,產生了乙個區域性變數uint,在函式返回時還會產生乙個臨時變數,程式要負責兩個uint型別的構造和析構,所以說+=比+效率高
const uint operator+(const uint i)
//uint型別可以和char、short、int、float、double等型別進行加減乘除運算
template
const uint operator+(t t)
//返回當前物件,你可以對他進行任何合法的操作,所以他的型別為non-const
uint& operator+=(const uint& i)
//uint型別可以和其他基本型別(能和int型別進行+=運算的所有型別)進行+=運算
template
uint& operator+=(const t& i)
//乘法 不是指標
const uint operator*(const uint& i)
template
uint operator*(const t& i)
//乘法 不是指標
uint& operator*=(const uint& i)
template
uint& operator*=(const t& i)
//隱式型別轉換,將uint型別轉換成int型別,當出現型別不匹配的時候,編譯器會尋找可能進行匹配的型別轉換,有時候這個隱式的型別轉換可能不是你要的
//如uint型別與int型別進行混合運算時,uint型別會自動轉換成int型別
operator
int() const
private :
int val;
};
大部分的解釋都在**中,有興趣的園友可以執行一下,應該會有收穫的,那些輸出的字串告訴你他所在的函式被執行了。
一下是陳太漢( 的部分觀點:
1:盡量使用初始化而不要在建構函式裡面賦值
建立物件分兩步:
1):資料成員初始化
2):執行被呼叫建構函式的**
用初始化列表的方式初始化成員變數,不用再建構函式內對成員變數進行賦值操作,不用初始化列表對成員變數進行賦值而在建構函式內進行賦值初始化,
初始化列表還是會執行,成員變數的預設建構函式還是會被呼叫。靜態成員變數只能被初始化,不能被賦值。
當然你的程式要承擔他構造和析構得費用。沒有const修飾時直接報錯
2):它使被修飾的變數不被修改,意義重大,如加法運算子的返回值型別為const,可以防止程式設計師對乙個加法表示式進行賦值。
3:指標跟指標所指的內容很容混淆,int i=5;int *p=&i;p=0表示將指標設為空,i的值還是5,指標p為空指標,不指向任何位址,*p=0表示將i的值修改0,指標p還是指向i。
4:組合運算子的效率比單一運算子高,++i的效率比i++高 ,請看**中的解釋
//返回型別是乙個常量指標,也就是說接收這個方法返回值的變數必須為常量指標
//這是乙個常量方法,所以不能修改成員變數的值
const uint* operator&() const
//返回當前物件的引用,當然你就可以對他進行任何合法的操作
//返回型別為引用型別或者指標型別就不會有臨時變數的構造和析構
uint& operator++()
//返回的是乙個區域性變數,你對區域性變數的任何操作都是沒有意義的,所以返回型別為const
//大家都知道區域性變數在超出他的作用域之後會自動析構,現在卻返回乙個區域性變數,這裡其實產生了乙個臨時變數,用oldval初始化臨時變數,
//若沒有變數接收當前方法的返回值,方法呼叫完成之後,臨時變數會自動析構,
//若有變數接收當前方法的返回值,臨時變數在該變數自動析構之前析構,在棧中先定義後析構,這就是傳說中的先進後出!
const uint operator++(int)
//加法運算,產生了乙個區域性變數uint,在函式返回時還會產生乙個臨時變數,程式要負責兩個uint型別的構造和析構,所以說+=比+效率高
const uint operator+(const uint i)
//隱式型別轉換,將uint型別轉換成int型別,當出現型別不匹配的時候,編譯器會尋找可能進行匹配的型別轉換,有時候這個隱式的型別轉換可能不是你要的
//如uint型別與int型別進行混合運算時,uint型別會自動轉換成int型別
operator int() const
部落格:
我所知道的EC Preface
我所知道的ec preface knowledge sharing is the best reusej 所以打算寫一篇 我所知道的ec 系列。取名為 我所知道的ec 是緣於網路上有一篇講述system bios的好文章叫做 我所知道的 bios 另外該系列文章是小弟的一家之言,希望各位前輩多多指教...
我所知道的EC PowerSequence
我所知道的ec powersequence what s power sequence power sequence 是指hw device 上電的順序 它的大致順序如下 1 always 2 sus on 3 dimm on 4 run on 5 vr on 這 基本上是 nb工作需要的所有pow...
我所知道的(1)
我所知道的之序言 最近總有朋友詢問我的事情,問得多了,也就回憶的多了,興奮的時候,就想乾脆整理成文字吧,也算對自己自06年以來給做諮詢的乙個總結。從06年以來我給的3個事業群做過了cmmi的諮詢,2次2級,3次3級,累計現場諮詢天數超過150天吧,所以日積月累,對有所了解。為了避免不必要的麻煩,我認...