C 程式設計思想1

2021-08-26 13:19:45 字數 2926 閱讀 2789

學了好久的 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...