C 學習需要認識的幾個基本概念

2021-08-29 03:06:54 字數 4687 閱讀 6761

變數宣告向編譯器保證變數以給定的型別和名稱存在,這樣編譯器在不需要知道變數完整細節的情況下也能繼續進一步的編譯。變數宣告只在編譯時有它的意義,在程式連線時編譯器需要實際的變數宣告。

同樣的,在函式宣告時,提供乙個函式名,而函式的實際定義則可以在任何地方進行。例如:

定義常量

#include using namespace std;

#define length 10

#define width 5

#define newline '\n'

int main()

呼叫型別

描述傳值呼叫

該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。(形參改變對實參無影響)

指標呼叫

該方法把引數的位址複製給形式引數。在函式內,該位址用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。(修改形參會同樣改變實參)

引用呼叫

向函式傳遞引數的引用呼叫方法,把引用的位址複製給形式引數。在函式內,該引用用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。(修改形參會同樣改變實參)

c++變數傳遞有傳值和傳引用的區別。可以通過前面的來指定

type arrayname [ arraysize ];

double balance[50];

double *p;

double balance[10];

p = balance;

1.陣列名是乙個指向陣列中第乙個元素的常量指標

2. p、(p+1)、*(p+2) 等來訪問陣列元素。 — c++ 傳陣列給乙個函式,陣列型別自動轉換為指標型別,因而傳的實際是位址。

4. 傳遞陣列給函式。

3. 返回陣列首先需要宣告的函式的返回型別為指標。

int * getrandom( );// 返回陣列的函式的宣告

c++ 指標

每乙個變數都有乙個記憶體位置,每乙個記憶體位置都定義了可使用連字型大小(&)運算子訪問的位址,它表示了在記憶體中的乙個位址。

什麼是指標:指標是乙個變數,其值為另乙個變數的位址,即,記憶體位置的直接位址。就像其他變數或常量一樣,您必須在使用指標儲存其他變數位址之前,對其進行宣告 ,格式如下:type *var-name;

int var = 20;

int temp;

int *ip;// 定義乙個指標

ip = &var;//把變數的位址賦值給指標

temp = *p;// 訪問指標變數中可用位址的值

1.引用變數是乙個別名,也就是說,它是某個已存在變數的另乙個名字。一旦把引用初始化為某個變數,就可以使用該引用名稱或變數名稱來指向變數。

2.試想變數名稱是變數附屬在記憶體位置中的標籤,您可以把引用當成是變數附屬在記憶體位置中的第二個標籤。因此,您可以通過原始變數名稱或引用來訪問變數的內容

int&  r = i;

double& s = d;

cout << "value of i : " << i << endl;

cout << "value of i reference : " << r << endl;

在這些宣告中,&讀作引用。因此,第乙個宣告可以讀作 「r 是乙個初始化為 i 的整型引用」,第二個宣告可以讀作 「s 是乙個初始化為 d 的 double 型引用」

結構是 c++ 中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。

struct type_name  object_names;
class box

;double box::getarea(double length, int height)

不管是何種繼承,都是取範圍較小的修飾符。

使用初始化列表來初始化字段:

line::line( double len): length(len)

上面的語法等同於如下語法:

line::line( double len)

類的析構函式是類的一種特殊的成員函式,它會在每次刪除所建立的物件時執行。區域性變數的**也會呼叫類的析構函式。

析構函式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號 –(~)作為字首,它不會返回任何值,也不能帶有任何引數。析構函式有助於在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源。

定義如下:

class line

;

析構函式的具體定義和普通函式一樣。它會在每次刪除所建立的物件時自動執行。

拷貝建構函式是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件

類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

(1)乙個物件以值傳遞的方式傳入函式體

(2)乙個物件以值傳遞的方式從函式返回

(3)乙個物件需要通過另外乙個物件進行初始化。

友元函式、友元類

類的友元函式是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。儘管友元函式的原型有在類的定義中出現過,但是友元函式並不是成員函式。

c++ 內聯函式是通常與類一起使用。如果乙個函式是內聯的,那麼在編譯時,編譯器會把該函式的**副本放置在每個呼叫該函式的地方。

對內聯函式進行任何修改,都需要重新編譯函式的所有客戶端,因為編譯器需要重新更換一次所有的**,否則將會繼續使用舊的函式。

如果想把乙個函式定義為內聯函式,則需要在函式名前面放置關鍵字 inline,在呼叫函式之前需要對函式進行定義

引入內聯函式的目的是為了解決程式中函式呼叫的效率問題,這麼說吧,程式在編譯器編譯的時候,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體進行替換,而對於其他的函式,都是在執行時候才被替代。這其實就是個空間代價換時間的i節省。所以內聯函式一般都是1-5行的小函式。在使用內聯函式時要留神:

1.在內聯函式內不允許使用迴圈語句和開關語句;

2.內聯函式的定義必須出現在內聯函式第一次呼叫之前;

3.類結構中所在的類說明內部定義的函式是內聯函式。

每乙個物件都能通過 this 指標來訪問自己的位址。this 指標是所有成員函式的隱含引數。因此,在成員函式內部,它可以用來指向呼叫物件。

乙個指向 c++ 類的指標與指向結構的指標類似,訪問指向類的指標的成員,需要使用成員訪問運算子 ->,就像訪問指向結構的指標一樣。與所有的指標一樣,您必須在使用指標之前,對指標進行初始化。

static

們不能把靜態成員的初始化放置在類的定義中,但是可以在類的外部通過使用範圍解析運算子 :: 來重新宣告靜態變數從而對它進行初始化

您可以重定義或過載大部分 c++ 內建的運算子。這樣,您就能使用自定義型別的運算子。

過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。

具體示例見 菜鳥教程

c++ 動態記憶體

c++ 程式中的記憶體分為兩個部分:

棧:在函式內部宣告的所有變數都將占用棧記憶體。

堆:這是程式中未使用的記憶體,在程式執行時可用於動態分配記憶體。

運算子:

使用new 運算子為給定型別的變數在執行時分配堆內的記憶體,這會返回所分配的空間位址。這種運算子即 new 運算子。

如果您不再需要動態分配的記憶體空間,可以使用delete 運算子,刪除之前由 new 運算子分配的記憶體。

有 new 就有 delete

命名空間用來解決不同庫中的相同函式名、變數名、類名等,使用了命名空間就相當於定義了上下文,定義了乙個範圍。

命名空間的定義

namespace namespace_name
命名空間的引用

namespace_name:: code;// code 可以是變數或函式

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...

強化學習的幾個基本概念

指 機器已對環境進行了建模,能在機器內部模擬出與環境相同或近似的狀況 此時,任意狀態x下執行動作a轉移到x 的概率p是已知的,該轉移帶來的獎賞r也是已知的 model based的問題可以用傳統的強化學習方法來解決,比如動態規劃,可以用bellman等式求得數值解 指 由於實際中沒法對環境進行建模,...

Kafka幾個基本概念

producer 訊息的生成者 consumer 訊息的消費者 consumergroup 消費者組,可以並行消費topic中的partition的訊息 broker 快取 kafka集群中的一台或多台伺服器統稱broker.topic kafka處理資源的訊息源 feeds of messages...