Boolan c 學習第一周筆記

2021-08-17 15:02:13 字數 4690 閱讀 1603

1.一種基於物件(object based),這種是單一的類的設計;一種物件導向(object oriented),多重class的設計;

對於類中的變數和函式而言,資料有很多份但是函式只有乙份。

2.標頭檔案的正規寫法:

#ifndef __頭檔名__

#define __頭檔名__

******

#endif

採用了防衛式宣告。

3.c++中的模板:

1.如果在類中定義成員資料的資料型別未定義的時候,可以考慮使用模板;

首先在類的宣告前先定義乙個:

template

在類宣告中定義資料時候,t  re,im;

再使用的時候,類名c1(2.5,1.5) 告訴編譯器定義為double型別。

4.內聯函式(inline)

在類本體裡面定義的函式就是內聯函式;內聯函式只是對編譯器的建議,不是絕對。

如果不在本體裡面定義的函式,想要變為內聯函式,使用inline關鍵字,但是inline關鍵字對於編譯器而言依然只是建議性的,不是絕對要求的。

5.對於資料而言,在類的定義的時候最好寫在private裡面,作為私有的,成員函式要具體分析具體對待;

為了資料的封裝性,在類的定義的時候,我們獲取資料一般是通過成員函式,而不是直接獲取,直接獲取(一般將資料設為private)是不正確的。

6.建構函式:

如果要建立物件,建構函式就會自動被呼叫起來;建構函式:

函式名和類的名字相同,可以帶有引數,同時引數是可以帶有預設值的,(這個預設值的作用在於建立物件的時候如果指明了數值則使用致命的,如果沒有就是用預設值。)。建構函式是沒有返回值,建立好物件之後則建構函式的任務則結束。

complex (double r = 0, double i = 0): re (r), im (i)

這種寫法更加優秀;

雖然可以寫成

這種賦值形式和上面的那種形式,效果一樣,但是上面的方法更加優秀,

一定的原因為:

乙個資料的定義一般分為初始化和賦值兩個操作,像上面的操作就是初值列,初始列,而下面的操作就是賦值。效率差一點。

7.函式過載

7.1建構函式很容易出現函式過載,

但是在沒有引數以及有預設值的時候,是不可以的。因為如果創造乙個物件,不給引數,那麼有預設值以及沒有引數的這兩個建構函式都可以使用,這種情況下會出錯,所以是不可以的。

所以有預設值的建構函式不能再去建立無參的同名的建構函式。

7.2建構函式在private區裡面,用在這種情況下就是不允許建立物件,這種情況下就是指允許有自己這乙份,不允許再去建立其他的。

8.成員函式:

8.1只是獲取資料的話,就需要加const加修飾,位置解除安裝函式名的後面,即函式名和引數的小括號的後面。

示例**:

double real() const;

real的這個函式沒有引數,功能只是將物件的資料進行取出,不進行修改資料,所以加const,將const加在引數的小括號的後面。不改變資料一定要const。

如果在定義物件的時候加了const修飾,那就表明程式設計師本身是不想改變物件裡面的所有的資料的,但是如果定義類的時候在獲取資料的成員函式沒有加const修飾,那麼編譯器會告訴程式設計師是可以改變物件的資料的,這就會造成矛盾,所以假如在定義物件的時候加const修飾,在獲取資料的成員函式的也必須要有const修飾。

9.函式的傳值(通過值的傳遞,通過引用傳遞,pass  by  value,pass by  reference )

9.1整個值傳過去,在對應的記憶體將資料完整的傳過去。引數傳遞最好用引用傳遞,因為效率比較高,這種情況下適用於大部分情況下。

const complex& 加const修飾,表明程式設計師不想改變傳過來的值,所以定義的類的成員函式不要去修改傳遞過來的引用。不加const修飾就表明成員函式可以修改傳遞過的引用。

9.2函式返回至(pass  by  value,pass by  reference)

返回值也盡量使用引用,但是在一些特殊情況下不能使用引用來返回函式的返回值。

返回值型別為***&這種就是return by  reference。

10.friend 友元函式。

friend complex& __doapl (complex *, const complex&);

友元函式太多會對封裝性造成一定的破壞性

int func(const complex& param)

yongfa :

complex c1(2,1);

complex c2;

c2.func(c1);

相同的class的各個物件之間互為友元。

11.class body外的各種定義;

body裡面的這些成員函式需要加const一定要去加,可以避免編譯器去報錯。

函式處理完資料需要將得到的結果存放到乙個地方,要麼新建乙個記憶體塊去存放(這種情況不能使用by  referenc   。因為這是在棧上,函式結束,這塊記憶體就結束了,沒用了,所以不能使用引用來返回值),或者就存放在傳進來的那塊記憶體裡面,

12.操作符過載。

12.1操作符過載--成員函式(this)

+= 這種操作符是二元操作符,示例:ths->re += r.re;  左值和右值兩邊都存在數值,需要進行操作符運算,在這種二元 操作符的情況之下,編譯器看待這個操作符是將它作用於左邊的數值,如果左邊的物件定義了這個操作符。就去呼叫那個函式。

譬如:inline complex&

complex::operator += (const complex& r)

其實,隱藏的東西為:

inline complex&

complex::operator += (this,const complex& r)

誰作用的就是這個this,二元操作符情況下是右值,this就是這個作用值的指標,.這個this實際上不能寫出來的。

inline complex&

__doapl (complex* ths, const complex& r)

inline complex&

complex::operator += (const complex& r)

這個示例**就是操作符過載的經典示例**。

講乙個簡單的功能寫成乙個函式,就可以提供給多個函式去呼叫和使用了。這個this在寫**的時候不能再實參列表中寫出來,但是在函式內部使用的時候可以寫出來,這個this就是左邊物件的指標,可以從這個例子中可以得到驗證。

總結:操作符左右兩邊,這個操作符作用域左邊,然後在看左邊物件中是否定義了這個操作符,再去根據this和相關的引數去呼叫相對應的操作符過載函式。this指向呼叫者,這種情況我的理解是應該適用於成員函式這種操作符過載的情況。

12.2 返回值通過引用。

inline complex&

__doapl (complex* ths, const complex& r)

這個地方我自己的理解就是this是個指標,然後通過指標取出這個數值,接收者再通過引用的方式去接收,(其實既可以通過引用接收,也可以通過value來接收。這應該就是所謂的傳遞者無需知道接收者以何種方式接收。)

傳遞者無需知道接收者是以引用形式接受。

至於在這個例子中。這個+=的返回值定義為complex&,而不是void,其實在單純的c1+=c2這種情況是可以定義為void,但是在c語言中有所謂的多運算子,c++也相容,所以在c1 += c2 += c3這種情況下就必須不能將返回值定義為void。所以設計運算子過載的話,要考慮到運算子連起來使用的這種情況下。

12.3

在標頭檔案定義類的時候,在類的body之後定義的函式,如果不帶有類名的就是全域性函式,帶有類名的就是成員函式。

12.4 操作符過載---非成員函式。

inline complex

operator + (const complex& x, const complex& y)

inline complex

operator + (const complex& x, double y)

inline complex

operator + (double x, const complex& y)

為了考慮多種情況(我個人覺得是實參的不同,即為實參的型別或者是個數不同等這些情況),所以需要考慮些多種情況的過載函式。而且不是成員函式的這種情況,一般是寫成全域性函式。

這個地方的返回值一定為by  value,不能為by  reference,因為這些得到的結果時臨時存放的,所以不能通過引用來傳。

而且c++裡面,提供了一種臨時變數的定義,typename() 這和int  i ,然後使用i是一樣的,定義乙個臨時變數,示例**:

return complex (x + real (y), imag (y));這就是所謂的臨時變數,

inline complex

operator + (const complex& x)

inline complex

operator - (const complex& x)

在這種情況下,編譯器會根據引數的個數來進行函式的選擇。第乙個也是可以通過引用來傳遞返回值。

12.5

特殊的操作符只能定義為全域性函式。

#include

ostream&

operator << (ostream& os, const complex& x)

cout的型別為ostream這種型別。

所以在使用的時候,示例**為:

cout << c2 << endl;

cout << (c1 += c2);

Boolan C 課程第一周筆記

第一周 20170407 類 帶指標 1 不帶指標 object based 基於物件 單一物件 object oriented 物件導向 多個有關聯的物件 語言學習 語言 標準庫 標頭檔案寫法 防衛式宣告 ifndef complex define complex 前置宣告 類的宣告 類的定義 e...

Boolan STL 第一周筆記

容器是用來儲存資料的,資料可以試使用者自定義的類,也可以試預定義的型別。c 中的容器主要使用有array vector list set map等。stl中的容器裡都有分配器,在宣告乙個容器的模板第二個引數就是分配器。分配器是用來給容器分配記憶體的,在一般情況下,使用預設的分配器即可。在stl中要實...

第一周周記

下面是整個文章的第二部分,日常的安利 這周的話,除了整體恢復正常,週末我也購置了我的第一塊外接鍵盤,這裡的話我選擇的是國產的靜電容鍵盤niz的plum 87鍵鍵盤。今天拿到這個鍵盤第一天,整體使用了一下,尺寸配合著15寸的蘋果macbook pro可以說恰到好處,除此以外,整個鍵盤還是給我不少驚喜的...