第八次複習 內含兩章半內容

2021-10-01 15:58:10 字數 4438 閱讀 2165

1.不能返回區域性變數或者臨時變數的引用

2.運算子過載

之前在理解成員函式上出現了一點錯誤,這裡改正

time operator+(const time& a )const //宣告時

time time::operator+(const time& a )const ;//定義時

b=a.operator(c) ; //順序不可改

b=a+c ; //表示式複雜時要三思

之前出錯是因為把返回型別放到了time::後面,這是不對的,因為這裡要呼叫time中的成員函式operator+();

運算子過載的限制

3.友元函式

在類的公有部分宣告

class a ;

a operator*(double m , a &t ) //宣告,只要像正常的函式那樣宣告就行了

4.對運算子《的過載

friend void operator<<( ostream& os ,const time &t ) ;

//這種方法不能連續拼接

friend void& operator<<( ostream& os ,const time &t ) ;

//解決方法,返回ostream中cout的引用 ,使其可以連續拼接

//輸出效果

coutinclude//srand();

include//rand();

srand(time(null)) ; //最好用srand(time(0)) ;

rand()%100 ;// 0~100內隨機乙個數字

rand()%100-5 ; // -5~95內隨機乙個數字

rand(3) ; // 輸出乙個三階矩陣,0~1內隨機數字

365*rand(1,60) ; // 60個1~365之間隨機正數

一般前兩種夠用了要用再查吧

偽隨機

因為time(num) ;取得值每次都一樣,都是固定區間的時間數

5.狀態成員

即對資料進行整合的函式

6.有關於轉換函式

stock(double a ):b(a ) ; //假如有構造

//在呼叫時

stock a = stock (19.6) ;//正常賦值

stock c = 20.8 ; // 隱式轉換 , 不可以有二義性,只能傳單參

//若要只允許顯示轉換

explicit stock(double a ):b(a ) ;

stock a = stock (19.6) ;//正常賦值,限定

有關轉換函式

class ap   //定義函式的轉化函式,無參,為類方法

} ;int main()

; int ap::a =1 ; //初始化類的靜態成員

2.類的複製建構函式

乙個內缺省會定義建構函式,複製建構函式,析構函式,還有一些忘了,後面會有整理

類的預設複製建構函式只會傳位址,所以如果new方法使用會產生錯誤

可以自己定義複製建構函式(深度複製)來解決

在陣列中有成員函式strcpy可以使用

類中定義:

class ap  ;

ap& ap::operator=(ap&d )

//過載後的複製建構函式可能出現二義性

3.nullptr/0 初始化指標 ,前者為c++11標準

**4.過載 **

這裡不想在演示一遍了,就和一般的過載方法相同

有定義char&string::operator(int i )

呼叫時string a[0]=『a』 ; //來給a物件中元素賦值

5.靜態成員

在類中定義的靜態成員函式的呼叫方法

class ap 

} ;

int main()

有關類的返回const和定位new方法和巢狀(遞迴)略沒勁

對於:初始化方法

@1只能用於建構函式

@2只能初始化非靜態非const的資料成員

@3必須用來初始化引用資料成員

@4c++11支援用()方法初始化和在私有成員定義時就初始化

如 int a(90) ; || private : a = 1 ;

6.初始化優先度

含參》不含參 ; 顯示構造》預設構造

1.派生類與基類

1.1為了擴大類的使用,在基類上引申出了派生類,發揮作為基類的補充作用。

1.2上**

class ap  ;    

} ; //作死定義了乙個超長的類

class k:public ap

;} ; //突然感覺好簡潔

int main()

注意公有派生類內不能訪問基類的私有成員

派生類的指標和引用可以呼叫基類方法,反之不可以

這種東西在用的時候自然就會了

寫了乙個出來當個樣子

class ap  ;

double myself (double m ) ;

} ; double ap::myself( double m )

class k:public ap

; double ii (double oo )

} ; //如果在外面定義的話需要在使用基類方法是用域運算子,如

/** double k:: ii (double oo )

*/int main()

笑死我了,這人逼格真高

3.關於多型公有繼承

聯編就是函式的呼叫

編譯過程中完成的聯編叫靜態聯編

執行過程中完成的聯編叫動態聯編

就是指多型,你兩個版本的虛函式只有在執行時才知道你要呼叫哪種,乙個選擇性質的事情

5.強制轉換

tql,這個大佬的舉得例子我一看就懂

關於向上強制轉換–即派生類指向基類的強制轉換

class base

也就是說為了保留轉換後函式的特徵, 需要使用引用或指標來向上轉換

關於向下強制轉換–基類轉換為派生類

base *b = new derived;

derived *d = dynamic_cast(b);

if(!d)

//輸出效果--derived

向下強制轉換也是為了不產生切割效果,從而輸出轉換後虛函式後的內容

切割:覆蓋方法和子類資料丟失的現象生成切割(slice)

自己摸索出來的向上向下強制轉換後的物件包含內容

1.向上強制轉換

class base

上面說明向上強制轉換後物件只能呼叫基類的方法而不能呼叫派生類的方法,但是虛方法呼叫的時派生類的

向下強制轉換

int main()

return 0;

}

基類向上強制轉換之後相當於乙個派生類的物件,不僅可以用基類和派生類普通方法,也可以用派生類定義的特有虛方法

總結:向上強制轉換之後相當於乙個用派生類虛方法的普通基類,向下強制轉換後相當於乙個本來的派生類

6.靜態聯編可以提高執行效率來節省記憶體

7.虛函式的定義

在不同類中定義的虛函式(形成)有不同的指標陣列(位址表),在使用時相應訪問(佔記憶體)//所以推薦靜態聯編

8.虛函式不同於建構函式,其可以呼叫虛析構函式,詳細我在上面的多型公有繼承中講到

虛函式的注意點:虛函式不能為友元(因為友元不為類方法)

關於重名函式:在派生類**現重名函式(不是虛函式)會造成函式的重新定義,也就是說不允許過載,強制定義就是覆蓋函式。

基類的函式隨之被隱藏//這就是「返回型別協變」

9.在類的繼承中,關鍵字protect終於展現出他的作用

保護訪問控制

在類中定義關鍵字protect:模組,相當於半個private,其限制其中元素只能在派生類中被訪問,也就是定義之後除了派生類,外部不能訪問其中元素。

**略,反之就是這個效果

第八次作業

練習題 1 怎麼查出通過 from xx import xx導 的可以直接調 的 法?在test package資料夾中建立 init py檔案,裡邊什麼都不需要編輯。在 中把test package的檔案的路徑加入到python直譯器可以搜尋到的路徑列表中,這裡就用到了python的包sys模組 ...

第八次作業

用python實現k均值演算法,鳶尾花花瓣長度資料做聚類並用散點圖顯示。import numpy as np 隨機生成乙個陣列 x np.random.randint 1,100,20,1 y np.zeros x.shape 0 dtype int k 3iris length 1.4,1.4,1...

第八次作業

問題 答案這個作業屬於那個課程 c語言程式設計ii 這個作業要求在 我在這個課程的目標是 更加熟練掌握markdown語法的相關用法 這個作業在那個具體方面幫助我實現目標 更加熟練的使用markdown,對本週知識總結 參考文獻 pta常見問題解析,c語言程式設計 1.pta實驗作業 1.1 求整數...