第11章 使用類

2021-08-11 16:59:25 字數 2107 閱讀 7020

關於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 ...