關於c++說一句:不要覺得必須使用所有特性,不要在試圖使用所有特性。只要滿足需求即可。c++是工具。少有人敢說精通c++
運算子過載:就是讓運算子能夠像操作基本型別一樣操作自己定義的類。
過載運算子就把運算子看成函式名就好了:operator+
。這個就當做函式名。然後利用的時候就kobe+james就好了。看本質上運算子就是一種函式,對物件進行操作。在運算子表示法中,運算子左側為呼叫運算的物件,右側的為引數傳遞物件。
運算子過載有一些限制,不過我覺得一般能過載的運算子足夠我用,所以就不列出了。書中有個**。
11.3友元
之前說過,對於類的私有部分,只有公有方法能夠訪問。這種限制有點死。
所以提供了友元這種訪問方式,友元有三種:
1、友元函式
2、友元類
3、友元成員函式
這裡先只介紹友元函式。
建立友元函式:
第一步:將其原型放入類宣告中,並在原型宣告前加上friend。
第二步:在定義cpp中,友元函式的定義前不要使用類限定(也好理解,友元函式並不是類成員函式),也不要使用friend關鍵字。
注意兩點:
1、雖然友元函式宣告在類宣告中,但是不是類成員函式,因此不能用.或者->運算子呼叫。
2、友元函式與成員函式訪問權相同,都可以訪問private成員。
最最最常用的友元就是過載《運算子,讓其能像基本型別一樣用cout<<
對其輸出顯示,而不是想之前一樣傻了吧唧的定義show()函式。
class student
cout
11.6類的自動轉換
假如乙個類的建構函式只需要乙個引數:stonewt(double lbs);
在使用時,就有可能這樣:
stonewt mycat;
mycat =16.6;
看起來就像將double型別的16.6轉換成了stonewt型別的mycat。等號賦值的時候進行隱式的型別轉換。
有時不希望隱式的轉換,因為有可能引起錯誤或誤會。在建構函式前加上explicit關鍵字即可:explicit stonewt(double lbs);
這樣就將隱式轉換關閉了,但是顯式強制型別轉換還是可以的:
mycat = 16.6;//不可以了!
mycat = stonewt(16.6);//這樣或者
mycat = (stonewt)16.6;//這樣也行。。
上面的建構函式,只是定義了其他型別向本類型別轉換,如果需要進行相反操作呢?將本類型別,轉換成其他型別。此時需要用到轉換函式。
還是上方的stonewt類:
//在類宣告中新增如下成員函式:
operator
int();
operator
double();
ok ,灰常簡單~有三個點:
1、轉換函式必須是類成員方法。
2、轉換函式不能指定返回型別。(很明顯返回型別是確定的,就是此類本身)
3、轉換函式不能有引數。(也好理解,引數就乙個,然後型別還被指定了,就不要寫了)
當然轉換函式也有隱式轉換這個問題:int a = mycat;
同樣explicit也是適用的:
explicit
operator
int();
explicit
operator
double();
宣告成這樣的話,上面的隱式轉換將不允許,必須要顯示強制轉換:int a = int(mycat);
,同理,括號擴int也是可以的。
最好是加上explicit,需要轉換時顯示強制轉換。可控的顯式的流程才清晰明了~~
第11章 使用類
1.運算子過載 未使用過載的例子 include using namespace std class time time time time time int h,int m void time addmin int m void time addhr int h void time reset i...
第11章 類物件導向理念
1,物件導向具體使用理念 2,原始碼 include include include 1,基類 通常在層次關係的根部有乙個基類 2,派生類 直接或間接從基類基礎而來,這些繼承得到的類稱為派生類 3,虛函式 對於某些函式,基類希望它的派生類各自定義適合自身的版本,此時基類就將這些函式宣告成虛函式,任何...
第11章 執行緒
執行緒標識 就像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,但執行緒id不同,執行緒id只有在它所屬的程序上下文中才有意義。程序id 用pid t資料型別表示 執行緒id用pthread t資料型別來表示 includeint pthread equal ...