C 學習 住著魔鬼的細節

2022-03-11 16:01:38 字數 3869 閱讀 6590

13周的c++課程轉眼就學完了5周,c++的標準基本上已經覆蓋到了。再加上coding了上百行,總算是對c++有了乙個基本的了解。接下來的學習會是關於stl的,所以在此對目前所學做乙個小的總結。

thedevilis in the

detail,這是我最大最大的體會。由其是對於這種稱之為標準的內容而言。更是如此。

這三個概念是很多程式語言裡面共有的,為了實現c++的高效率,這3板斧更是被發揮的淋漓盡致。總結一下,可以分為兩種情況:【傳】【返回】。

【傳】賦值的意思就是對變數進行複製  fun(int a), fun(5)。 matlab 裡全部都是這樣的呼叫,matlab 並不能傳引用。這樣做的好處是函式不會修改傳入值,壞處是需要對傳入的引數進行複製,如果引數很大(e10的點雲),那麼複製會有很大開銷。

【傳】引用的意思是將變數的引用傳入,比如 fun(int & a) , int b; fun(b)。這樣的做法可以在函式中改變b的值。好處是直接傳了位址,不需要複製開銷,壞處是不利於變數保護。

【傳】指標和傳引用類似,一般情況下,指標是一種很醜的引數,但是有的時候又不得不以指標作為引數。比如點雲,往往點雲的規模是動態的,記憶體也是動態分配的,所以很多點雲處理函式的引數都是pointcloud::ptr,傳指標是會改變指標所指向的內容的。

【返回】值的意思是函式返回乙個值,往往是 a = fun(b),被返回的值只能做右值。

【返回】引用的意思是返回乙個變數,這個變數可以有值,也可以未被初始化。它是可以作為左值的,比如 a.getobj() = createobj(a). 或者 ostream & operator <

總而言之,返回引用多半是為了做左值,返回指多半是因為有開銷上的顧慮。

const 有三種用法,分別是和數結合,和指標結合,和函式結合。

【和數結合】和數結合的情況非常單純,意思就是這個變數不能改了。 int c, const int a =5; const int & b = c; 這樣的情況下a = 1, b= 1都會報錯,如果想要b = 1,可以令c = 1;

【和指標結合】和指標結合的情況有點點複雜,分兩種 const int * p = & c; 表示常int,這是意思是c的值不能通過p 來修改,和上面的常引用是一樣的意思!! int const *p = & c 則表示常*p,意思就是p不能指向其他資料。

【和函式結合】和函式結合要更複雜那麼一點點。分兩種情況,fun(const int & a),表示a 不能被修改。fun(int a) const{},const 修飾{}——常成員函式,表示成員函式不允許修改成員變數。常物件只能呼叫這種常成員函式。

構造與析構是物件導向的路子。主要是建構函式有一點複雜,分預設構造,普通構造,拷貝構造。

【預設構造】如果我們不寫建構函式,那麼會自動生成預設建構函式。但是一旦寫了,那麼就沒有預設建構函式了。如果你想要沒引數的建構函式,要麼用預設值偽裝,要麼自己寫上 myclass(){}。建議後者,有時候不記得搞了預設值會出事的。

【普通構造】建構函式的作用是初始化成員變數,如果成員變數是私有的,那很可能只有這麼一次機會初始化。

【拷貝構造】拷貝構造是最囉嗦的,它有兩種呼叫形式:1、myclass b ;  myclass a(b); 2、myclass a = b。 第二種看似用了操作符 = ,實際不是的,它調了拷貝建構函式,而不是操作符過載。如果你過載了=,最好別有二義性。

【析構函式】析構函式最重要的是,如果用new 申請了變數,那麼一定要在析構函式裡delete 。當然,如果用boost 的 智慧型指標,可以不用手動釋放。

操作符過載還是比較好理解的,記好乙個細節,左值要返回引用。

繼承是 is 的操作,如果乙個類繼承了其夫類,那麼子類的物件,在記憶體裡會有父類的所有成員變數!並且自動獲得父類所有的成員函式。不過獲得的成員函式只能操作記憶體裡父類的那些成員變數了。

設計繼承最重要的是子類必須獲得父類所有的性質。如果父類有乙個行為是子類不需要的,那麼就算設計的不好了。

子類中比較有難度的是建構函式的設計,因為要對記憶體裡父類的那些成員變數賦值,所以其建構函式要寫成如下:son(int a,int b,int c):father(a,b),c_(c){}。直接用父類的類名,來完成成員變數的賦值。乙個簡單的繼承例子如下:

1 #include 2 #include 3 #include 4

using

namespace

std;56

class mystring:public

string7;

10 mystring(const

string & s):string

(s){};

11 mystring(const

char * s):string

(s){};

12mystring(){};

1314 mystring operator()(int start_index,int

length)

2021 ~mystring(){};

22};

2324

2526

int comparestring( const

void * e1, const

void *e2)

3334

intmain() ;

37 cout << "

1. "

<< s1 << s2 << s3<< s4<

38 s4 = s3; s3 = s1 +s3;

39 cout << "

2. "

<< s1 <

40 cout << "

3. "

<< s2 <

41 cout << "

4. "

<< s3 <

42 cout << "

5. "

<< s4 <

43 cout << "

6. "

<< s1[2] <

44 s2 = s1; s1 = "

ijkl-";

45 s1[2] = 'a'

;46 cout << "

7. "

<< s2 <

47 cout << "

8. "

<< s1 <

48 s1 += "

mnop";

49 cout << "

9. "

<< s1 <

50 s4 = "

qrst-

" +s2;

51 cout << "

10.

"<< s4 <

52 s1 = s2 + s4 + "

uvw

" + "

xyz"

;53 cout << "

11.

"<< s1 <

54 qsort(sarray,4,sizeof

(mystring), comparestring);

55for( int i = 0;i < 4;++i )

56 cout << sarray[i] <

57//

輸出s1從下標0開始長度為4的子串

58 cout << s1(0,4) <

59//

輸出s1從下標為5開始長度為10的子串

60 cout << s1(5,10) <

61return0;

62 }

view code

這裡,mystring 雖然沒說,但是獲得了string所有的操作符過載(=,+....)還有所有的函式(substr)。唯一需要好好設計的就是建構函式。

魔鬼的細節 1 2

有些國家有些人確實做得不同凡響,成功地秘訣就在於細節。魔鬼的細節 魔鬼的細節 細節 一周的南韓之行,有無數次上下地鐵的經歷。當我們好容易學會使用交通卡時,卻發現有人竟用手機當門票。他拿手機在感應器處晃一下,柵欄門就自動放行了。可能這種手機帶有電子貨幣功能吧。魔鬼細節之反面 央視主持人說 播音員當年曾...

魔鬼的細節 1 2

有些國家有些人確實做得不同凡響,成功地秘訣就在於細節。魔鬼的細節 魔鬼的細節 細節 一周的南韓之行,有無數次上下地鐵的經歷。當我們好容易學會使用交通卡時,卻發現有人竟用手機當門票。他拿手機在感應器處晃一下,柵欄門就自動放行了。可能這種手機帶有電子貨幣功能吧。魔鬼細節之反面 央視主持人說 播音員當年曾...

C 學習細節

ifndef define endif的使用 防止該標頭檔案被重複引用 其實 被重複引用 是指乙個標頭檔案在同乙個cpp檔案中被include了多次,這種錯誤常常是由於include巢狀造成的。比如 存在a.件 include c.h 而此時b.cpp檔案匯入了 include a.h 和 incl...