C 學習記錄

2021-07-23 19:59:07 字數 2516 閱讀 7194

原創

主要是c#和c++不同的地方,會寫一下,流程控制什麼的都差不多,比較適合c#轉c++的人看

以前沒有系統的學過c++,現在補一下,以前完全是為了看懂別人的**稍微看一下,也沒有太想在這方面下功夫,學一點是一點,目標是能修改別人的c++服務端程式。

一.包含

包含原理上什麼檔案都能包含進來,但是一般只包含.c標頭檔案。將.c標頭檔案的全部內容複製到#include包含處。

#include

< >  引用的是編譯器的類庫路徑裡面的標準標頭檔案, 系統內建的。

#include " "    引用的是你程式目錄的相對路徑中的標頭檔案,在程式目錄的相對路徑中找不到該標頭檔案時會繼續在類庫路徑裡搜尋該標頭檔案。

二.標頭檔案和原始檔

一開始只有原始檔,所有**都寫在原始檔裡,為了對外提供介面,所以把**分開寫在標頭檔案和原檔案。

.h     標頭檔案宣告(類的宣告,內聯函式,全域性變數,結構體等)

.cpp 原始檔實現(具體邏輯)

三.  ::域操作符

1.比如標頭檔案裡宣告了乙個類,這個類裡宣告了乙個成員函式void aaa(),但沒有方法體,那麼在類外定義函式時, 就要寫成void a::aaa(),表示這個函式是類a的成員函式。

2.::前面沒有網域名稱 那麼就是全域性變數,全域性函式等。

3. 表示引用成員函式及變數  system::math::sqrt() 相當於system.math.sqrt()

四.  ->箭頭操作符

表示呼叫左邊的指標所指的物件中的成員,類似於點號的功能,但是左邊必須為指標。

五. c++的new

ctest* ptest = new ctest();        //ptest用來接收類物件指標,new申請記憶體。

delete ptest;            //new申請的物件,只有呼叫到delete時才會執行析構函式,如果程式退出而沒有執行delete則會造成記憶體洩漏。

不用new,直接使用類定義申明:

ctest mtest;           //使用完後不需要手動釋放,該類析構函式會自動執行。

六. 內聯函式和外聯函式

1)內聯函式:宣告在類裡的成員函式,並且主體也在類裡。區別:編譯後會直接放在呼叫點的函式體內, 從而使得**增大, 但是效率提高了。

2)外聯函式:宣告在類裡的成員函式,但主體在類外實現。區別:呼叫時在呼叫點生成乙個呼叫指令, 函式本身不會被放在呼叫者的函式體內, 所以**減小, 但效率較低。 

3)外聯函式轉換成內聯函式:函式頭前面加上關鍵字 inline 。比如:inline int myclass::jiafa(int a, int b)

不管是如何,只能有乙個函式主體,不能再類裡面有個函式主體,類外又寫個函式主體,會報錯。

七.指標(這個東西感覺看再多教程用處不大,下面都是我自己理解的。)

指標本身4位元組,存放在棧中,指向的記憶體可能堆可能棧。

*     :取值運算子,記憶體的內容。    還可以是 指標符號   宣告指標用的,比如:int* a  宣告a的指標型別是int*型 (我當時就是這的地方饒了好久沒出來)

int* a ;                  //宣告a是int*型指標,指向一塊int型的記憶體區域

int b = 10; //宣告乙個變數

a = &b; //a指向了b的記憶體位址

cout << *a << endl; //指標取值10

cout << a << endl; //指標a指向的記憶體位址

cout << &a << endl; //指標a自身的記憶體位址

八.void* 泛型指標

可以指向任何型別資料的指標,取值必須先把空指標轉化成明確型別的指標,再取值。

void* a;                  //泛型指標

int b = 10;

a = &b; //指標a指向的位址是b的記憶體位址

cout << *(int*)a << endl; //先將a的指標型別轉換為int* 再用*取值

b = 3;

cout << *(int*)a << endl; //因為a和b是乙個記憶體位址,所以b=3,a的值也變成3了

九.#define 巨集定義

預編譯前,先將巨集名用被定義的字串替換,替換後才進行編譯,也就是巨集在替換前是不計算的。

#define xigua  "大西瓜"

#define  n 2+2

cout << n*2 << endl;        //結果是6,不是8!   巨集只是替換不計算  

十.c++中的結構體

這種寫法就是mystruct結構體有個別名bieming,都能用。

typedef struct mystruct

bieming;        

十一. 陣列作為函式的引數,傳遞的是位址!也就是說,在別的函式裡修改了陣列,是在記憶體中直接修改了。

C 學習記錄

由於之前寫c c 程式時,動不動就容易報錯,也就沒繼續用,一直覺得c 很難。最近在學習機器學習時,用到了乙個c 神經網路庫,並且在菜鳥教程中看到了c 的教程,於是學了一下,發現根本沒有想象中的那麼難,可能也是這個教程講的比較好吧。現在把一些學到的比較重要的點記錄一下吧!1.ifndef 突然覺得在標...

C 學習記錄

reserve和resize的區別 reserve是容器預留空間,但並不真正建立元素物件,在建立物件之前,不能引用容器內的元素,因此當加入新的元素時,需要用push back insert 函式。resize是改變容器的大小,並且建立物件,因此,呼叫這個函式之後,就可以引用容器內的物件了,因此當加入...

c 學習記錄

時隔多年,再次學習c 原因在與看了很多開源 的實現,都是c c,不禁想彌補一下這方面的知識。在c c 中,為了解決一些頻繁呼叫的函式,節省棧空間,引入了inline關鍵字,將呼叫的函式實現直接替換到函式處。從上述可以看出兩點 1.inline是一種對編譯器的建議,真正是否inline,還得看這個函式...