C 中的一些定義

2022-08-16 23:00:12 字數 2382 閱讀 5311

ps: 這篇部落格用來記錄一些一般的c++書中草草掠過的一些概念。 或者一些不太容易理解的概念的詳細解釋。 歡迎新手進入,歡迎高手指正! orz 。

引用: 為物件起了另外乙個名字, 引用型別引用(refers to)另外一種型別。

int ival = 1024;

int &refval  = ival;

int &i//報錯。

一般在初始變數時,初始值會被拷貝到新建的物件中。 然而定義引用時,程式把引用和它的初始值繫結(很類似與指標)在一起,而不是把初始值拷貝給引用。一旦初始化完成,引用將和它的初始值繫結在一起。因為無法令引用重新繫結到另外乙個物件,因此引用必須初始化!

引用本身不是物件, 而只是為乙個已經存在的物件所起的另乙個名字。 因為引用本身不是物件, 所以不能定義引用的引用。

指標與引用的區別: 《1》 引用本身不是乙個物件。而指標本身就是乙個物件, 所以可以有指向指標的指標,允許對指標的賦值和拷貝,而且在指標的生存週期內它可以指向幾個不同的物件。        《2》 指標無需在定義時賦值(但是,盡量要定義後立即賦值, 不然如果,忘賦值了會有很大的隱患!), 和其他內建型別一樣,在塊作用域內定義的指標如果沒被初始化,也將擁有乙個不確定的值。 

陣列名與指標:

在大多數情況下, 陣列名被解釋成其第乙個元素的位址, 然而也有例外。 《1》 陣列宣告使用陣列名來標記儲存位置; 《2》 對陣列名使用sizeof將得到整個陣列的長度(以位元組為單位); 《3》 將運算子&用於陣列名時, 將返回整個陣列的位址。 也即是: 定義陣列時,申請的記憶體塊的位址。

兩個轉化公式:  arr[i] = *(arr+i) // values in two notations

&arr[i] == arr + i // addresses in two notations

陣列在函式中傳遞:

當陣列是一維陣列的時候我們很好理解, 因為陣列名被解釋成其第乙個元素的位址, 形參中只要有乙個指標變數(或陣列名)來接受就行啦。 然而當陣列名是二維陣列時怎麼辦呢? 它既有行,又有列。

int data[3][4] = , , };

int total = sum(data, 3);

data是乙個陣列名, 該陣列有三個元素,其中每乙個元素都是陣列, 由4個int值組成。 因此data 的型別是指向有4個int組成的陣列的指標, 因此正確的原型如下:

int sum(int (*ar2)[4], int size); //

(*ar2)[4]是乙個指向由4個int組成的指標

int *ar2[4]; //

4個指向int的指標組成的陣列。注意與上面區分!

臨時變數, 引用引數和const

如果實參與引用引數不匹配, c++將生成臨時變數。 當前, 僅當引數是const 引用時, c++才允許這麼做 ,但是以前不是這樣的。

如果引用引數是const, 則編譯器將在下面兩種情況下生成臨時變數:

《1》 實參的型別正確,但不是左值。

《2》實參的型別不正確, 但是可以轉化成正確的型別。

左值是可以被引用的資料物件, 如: 變數, 陣列元素, 結構成員, 引用和解除引用的指標都是左值。 非左值包括字面常量(用引號括起的字串除外,它們由位址表示!)和包含多項式的表示式。 在c語言中最初的左值指的是可以出現在賦值語句左邊的實體。 但是這是在const關鍵字引入之前的事, 現在常規變數和const變數都可以作為左值(但是const變數並不能被修改!)

#include using

namespace

std;

double refcube(const

double &ra)

intmain()

;

double c1 = refcube(side); //

ra is side

double c2 = refcube(lens[2])//

ra is lens[2]

double c3 = refcube(rd) //

ra is rd is side

double c4 = refcube(*pd)//

ra is *pd is side

double c5 = refcube(edge); //

ra is temporary variable

double c6 = refcube(7.0); //

ra is temporary variable

double c7 = refcube(side + 10.0); //

ra is temporary variable

return0;

}

確切的說, 上面說的是左值引用, c++11新增了一種新的引用-----右值引用。 關於這個問題以後再說!

C 中,定義類(Class)的一些原則

1 定義類時,除非真的需要被其他類繼承,否則都用標記sealed,編譯器預設為非sealed 除非真的需要該accembly之外的類呼叫,否則都標記internal,除非特殊宣告,編譯器預設即為internal。2 類中的屬性 field 盡量定義為private,真的需要其繼承類呼叫時,盡量宣告為...

C 的一些定義理解

1 介面 所謂介面,可以理解成一種協議和標準。它提供給繼承他的所有的類乙個標準 比如說 屬性 方法返回值 引數等 這樣可以簡化 程式可擴張性提高。用法 乙個方法如果需要引用到某些類做引數,而這些類的返回結果都一樣,只是實現方法不同,傳統的用法是用方法過載 引數不同,也就是各個類作為不同的引數引進 但...

c 中 try catch 的一些

習慣了在 js 中寫 try catch 語句,所以在c 中瞎寫。杯具。我對c 的了解太少了。1.在c 中,很多錯誤是try catch 捕獲不到的,比如空指標訪問,野指標訪問等,程式都直接崩潰,不會讓你捕獲的。所以,很遺憾,我慣用try catch,並沒有達到預期。2.絕大多數 windows a...