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 4view codeusing
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 }
這裡,mystring 雖然沒說,但是獲得了string所有的操作符過載(=,+....)還有所有的函式(substr)。唯一需要好好設計的就是建構函式。
魔鬼的細節 1 2
有些國家有些人確實做得不同凡響,成功地秘訣就在於細節。魔鬼的細節 魔鬼的細節 細節 一周的南韓之行,有無數次上下地鐵的經歷。當我們好容易學會使用交通卡時,卻發現有人竟用手機當門票。他拿手機在感應器處晃一下,柵欄門就自動放行了。可能這種手機帶有電子貨幣功能吧。魔鬼細節之反面 央視主持人說 播音員當年曾...
魔鬼的細節 1 2
有些國家有些人確實做得不同凡響,成功地秘訣就在於細節。魔鬼的細節 魔鬼的細節 細節 一周的南韓之行,有無數次上下地鐵的經歷。當我們好容易學會使用交通卡時,卻發現有人竟用手機當門票。他拿手機在感應器處晃一下,柵欄門就自動放行了。可能這種手機帶有電子貨幣功能吧。魔鬼細節之反面 央視主持人說 播音員當年曾...
C 學習細節
ifndef define endif的使用 防止該標頭檔案被重複引用 其實 被重複引用 是指乙個標頭檔案在同乙個cpp檔案中被include了多次,這種錯誤常常是由於include巢狀造成的。比如 存在a.件 include c.h 而此時b.cpp檔案匯入了 include a.h 和 incl...