學了好久的 c++了 發現自己對於c/c++還是沒有深入的了解 於是 咬咬牙啃起了 c++程式設計思想 希望能有所感悟 。。
我以前是直接學c++的對於c不是很了解,然而又是在vc下 學習 所以 沒有好好的 去學習 標準c++,直到我 看起c++程式設計思想 我發現真應該從頭再學一遍了 。。。
1、定義的宣告的區別 :
宣告是 宣告了標示符的存在 並沒有為 其分配空間 ,而定義 是為其分配的一定的儲存空間
int * p ;//這是對指標的宣告 並且定義
int p;//這是對整形變數的宣告並且定義
exern void show() ;==void show() ;
對於函式來說只要沒有函式體 那麼都是宣告 extern 表示對函式的宣告 表示這個函式是再外部定義的 。
我們在編譯器下 同時寫下
int i;
int i ;//會出現衝的定義的錯誤 編譯器會理解為"我到底改用那個i呢?"
extern int i ;
int i ;//那麼就不會出現錯誤 原因是 第乙個i是乙個對於變數的宣告並沒有分配儲存空間 第二次 才為 i分配了儲存空間
2、 memcpy函式void*memcpy( void*dest
, const void*src
, size_tcount
);
這個函式我們在c中經常用到 ,其實 他 跟 strcpy很類似 都是向目的型別的位址 拷貝 n個 記憶體塊
注意這裡的引數是 void* 因為我們是對記憶體塊進行操作 所以可以是任意資料型別
程式設計師對於記憶體的理解應該一視同仁 沒有型別的區別 。 只是我們在使用記憶體的時候 將二進位制** 進行了 資料化了
3、 malloc函式和 calloc函式 assert函式
void *malloc( size_tsize
);
void *calloc( size_tnum
, size_tsize
);
void assert( intexpression); //如果引數是false那麼 強制終止程式的執行 也就是 非0 退出
這兩個函式都是在堆中分配指定大小的void* 記憶體區域 只是calloc可以進行初始化
而 malloc函式不進行初始化 。當malloc函式分配的內存在 第一次被使用的時候 那麼 它的每個單元的資料可能是 0
但是 如果分配來的這塊記憶體區域被使用過了 那麼就可能使任意數了 。
這裡我們會問free函式 做什麼了?
free函式 只是告訴編譯器 我們之前用malloc分配的記憶體區域 可以重複使用而已,在一定程度上可以理解為釋放
現在想想 我們的 fopen 函式和 fclose函式 所 用到的 file結構體也是 由此 而來的
4、標準庫的發放形式
我們在 vc中用到 string.h 等等標頭檔案 就可以使用裡面定義的函式 等等 我們可以找到 string.h 但是我們卻找不到他的實現檔案 cpp(也就是原始檔)
在以往的c庫的編寫中我們通常將具有 統一功能 和 分類的 一組 資料型別 和函式放在乙個 標頭檔案中定義,然後再原檔案中實現 。然而我們到 微軟提供的vc下面卻找不到這些對應檔案的實現 。這是因為對於 微軟而言 我們是使用vc的使用者 ,雖然我們是軟體開發者,但是我們是在微軟的平台下使用。
微軟給我提供了的藉口是 標頭檔案+動態鏈結庫的 形式 而不是 標頭檔案+原始檔的形式 。
對於微軟而言 不會給我們 庫的實現部分 。只需要給我們提供動態鏈結庫,我們就可以使用它們所定義的函式 以及型別
5、重複定義的問題
#ifndef test
#define final
#endif
在乙個較大的工程中我們可能會用到多個標頭檔案 架設 我們在多個標頭檔案中同時包含了 乙個標頭檔案 那麼 在 編譯器進行編譯鏈結的時候
就會發生 資料型別或者 函式的 重複定義問題 為了解決這個問題 那麼我們要用到 預編譯指令
如果在 lib.h的標頭檔案下有 int i ; 為了防止被重複定義 那麼 我們在 lib.cpp中應該這樣定義
#ifndef lib_h_
int ;
#endif ;
這樣就可以防止統一資料 被重複定義的問題
6、 c++的封裝
c++的封裝 這是乙個歧義的問題?
有些人把封裝用在解釋隱藏上 ,而我覺得用來解釋類這乙個抽象資料型別很合適 、
在以前的c中 struct 結構體中我們吧 一組相關的 屬性組合成乙個結構體 那麼這個結構體 只是作為資料的封裝,沒有其他的實際意義。
但是在c++中則不同了。
類中可以加入函式 ,等操作行為 使物件導向的思想得以很好的實現,乙個類代表一類事物,乙個類的例項代表乙個物件 ,這個物件有自己的屬性和行為 。
我們把操作的函式封裝在類中 也可以避免c中函式命名重複的問題 。
6、聯合 union 列舉 enum的簡單實用
對於聯合來說他的大小是成員中資料型別位元組最大的儲存 我們在使用的時候 使用資料型別中的乙個 可以節約儲存空間
enum其實定義的是基於 0開始的 一些資料成員 當然我們可以對列舉成員進行賦值 簡單應用如下
#include
using namespace std ;
enum day
;union me
;void main()
c 程式設計思想
c和c 指標的最重要的區別在於 c 是一種型別要求更強的語言。就void 而言,這一點表現得更加突出。c雖然不允許隨便地把乙個型別的指標指派給另乙個型別,但允許通過void 來實現。例如 bird b rock r void v v r b v c 不允許這樣做,其編譯器將會給出乙個出錯資訊。如果真...
openCV程式設計思想總結(1)
最近發現自己寫 最難得就是開頭,而且就算開頭了,寫到一半會發現自己的 思想十分簡單,執行效率低下,然後看別人寫的 就會有種頓悟的感覺,然後自己的 就相形見絀。所以總結寫別人的 中的精妙之處,所謂君子性非異也,善假於物也。mat tsmresp 1,img roi.rows,cv 32fc1,scal...
C 程式設計思想 模板
模板將型別以乙個識別符號替代,想要使用模板就需要遵守模板對這個識別符號的要求,比如對識別符號有什麼成員變數以及成員函式。include include using namespace std 這是乙個模板類的實現,展示模板的特性之一 約定性 template class t classx class...