C 學習記錄

2021-07-10 17:24:46 字數 2121 閱讀 5206

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

現在把一些學到的比較重要的點記錄一下吧!

1. ifndef

突然覺得在標頭檔案開頭加乙個ifndef的巨集定義是那麼重要,不然在多個cpp檔案include這同乙個標頭檔案時會出現宣告衝突的錯誤。以animal.h為例,它的用法是:

#ifndef _animal_h_

#define _animal_h_

//**寫在這裡

#endif

2. static與extern

static 儲存類:指示編譯器在程式的生命週期內保持區域性變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷毀。因此,使用 static 修飾區域性變數可以在函式呼叫之間保持區域性變數的值。

extern 儲存類:當您有多個檔案且定義了乙個可以在其他檔案中使用的全域性變數或函式時,可以在其他檔案中使用 extern 來得到已定義的變數或函式的引用。可以這麼理解,extern 是用來在另乙個檔案中宣告乙個全域性變數或函式。

詳見c++儲存類

3. 析構函式

類的析構函式是類的一種特殊的成員函式,它會在每次刪除所建立的物件時執行。但是我在閱讀cnn庫的原始碼時,發現了作者對析構函式的妙用,讓我感嘆其精妙之處。這段**的作用是輸出每次迴圈或者任務的用時,**如下:

#ifndef _timing_h_

#define _timing_h_

#include

#include

#include

namespace cnn

~timer()

std::string msg;

std::chrono::high_resolution_clock::time_point start;

};} // namespace cnn

#endif

在使用時,只需要在迴圈開始的地方宣告乙個改結構的物件,如:timer iteration("completed in")。建立該物件時傳入提示資訊並記錄開始時間,而當該次迴圈結束時,物件自動銷毀,並呼叫析構函式,在析構函式中獲取結束時間,計算時間差並輸出。

4. 友元函式與內聯函式

friend:類的友元函式是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。儘管友元函式的原型有在類的定義中出現過,但是友元函式並不是成員函式。友元可以是乙個函式,該函式被稱為友元函式;友元也可以是乙個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。

inline:c++ 內聯函式是通常與類一起使用。如果乙個函式是內聯的,那麼在編譯時,編譯器會把該函式的**副本放置在每個呼叫該函式的地方。對內聯函式進行任何修改,都需要重新編譯函式的所有客戶端,因為編譯器需要重新更換一次所有的**,否則將會繼續使用舊的函式。注:在類定義中的定義的函式都是內聯函式,即使沒有使用 inline 說明符。

5. 繼承

class derived-class: access-specifier base-class
access-specifier有public,protected和private:

6. 多型/虛函式

當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型。

c++ 多型意味著呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。

virtual

int area() = 0;

= 0 告訴編譯器,函式沒有主體,上面的虛函式是純虛函式。有純虛函式的類稱為抽象類,抽象類不能被用於例項化物件,它只能作為介面使用。如果試圖例項化乙個抽象類的物件,會導致編譯錯誤。注:

7. 其他

override:在c++11中為了幫助程式設計師寫繼承結構複雜的型別,引入了虛函式描述符override,如果派生類在虛函式宣告時使用了override描述符,那麼該函式必須過載其基類中的同名函式,否則**將無法通過編譯。該關鍵字可以防止在子類中函式被寫錯。

c++教程 | 菜鳥教程

C 學習記錄

原創 主要是c 和c 不同的地方,會寫一下,流程控制什麼的都差不多,比較適合c 轉c 的人看 以前沒有系統的學過c 現在補一下,以前完全是為了看懂別人的 稍微看一下,也沒有太想在這方面下功夫,學一點是一點,目標是能修改別人的c 服務端程式。一.包含 包含原理上什麼檔案都能包含進來,但是一般只包含.c...

C 學習記錄

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

c 學習記錄

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