C 基礎知識

2022-01-10 12:56:48 字數 2453 閱讀 2415

最近在求職(現在已經找到工作,但是遇到一些不太熟悉容易忽略的基礎知識仍會持續更新),求職免不了面試,面試則免不了對基礎知識的提問,而我學習的時候卻是從直接上手敲**開始,基礎知識可以說是很薄弱,很多地方知其然不知其所以然,最近只好苦學基礎知識,俗話說:好記性不如爛筆頭,這裡將我學到的東西記錄一下,方便日後複習使用,如果能幫助別人的話那是最好了。廢話不多說,開始。。。。。。。。。。。。

1、static

static變數有的人說只賦值一次,我覺得不是,static變數可以多次賦值,但是以最後一次賦值為準,並且變數用完後不會消失,直至整個程式退出。例如乙個網頁,定義了乙個static變數,在不同的button事件中可以任意賦值,但是變數儲存的永遠是最後一次賦的值。如果不重複賦值,那麼怎麼重新整理頁面,變數仍然為原來的值,直至伺服器關閉。在c#裡面還有static建構函式,這樣的建構函式只在第乙個例項建立的時候執行,之後不會再執行。

而static方法的話就是方法屬於類而不是資料類的物件,無需例項化類可直接使用static方法。

2、const與readonly區別

1)const和readonly變數的值一旦初始化都不能再更改

2)const變數只能在宣告的時候初始化,而readonly變數可以在建構函式裡面進行初始化

3)const常量預設是static的,而readonly則不預設,若要設為static型別,則要顯示的宣告(如:static readonly int a)

4)const是編譯期靜態解析的常量,readonly則是編譯期動態解析的常量

5)const既可以修飾類中的成員,又可以修飾函式體內的區域性變數,而readonly只可以用來修飾類中的成員

3、結構體和類

以前一直不知道像int、bool這些就是結構體,真是汗顏啊,結構體和類有相似的地方,也有不同的地方

相同的地方:

(1)結構體和類都可以繼承藉口

(2)結構體和類都可以宣告字段、方法、建構函式,只是結構體的建構函式必須有引數,結構體有預設的建構函式,並且不能被重寫

不同的地方:

(1)結構體有預設的建構函式,可以自己寫建構函式,但是必須帶有引數,而類可以寫無引數的建構函式,很多人都說結構體不能用new初始化,大多都是互相抄襲吧,自己不試就寫出來很不負責任的,結構體不管有沒有定義含引數的建構函式都可以用new例項化的。

(2)結構體不能繼承結構體,而類可以繼承或被繼承

(3)結構體是值型別,而類是應用型別,對應的存在的位置也會不同,結構體存放在記憶體棧中,而類存在記憶體堆中

4、介面和抽象類

其實我個人覺得介面更像是抽象類的公升級版,更加抽象了,比抽象類更抽象:)

相同的地方:

(1)介面和抽象類均無法例項化,只能被繼承

(2)抽象類和介面均可用實現其的子類替代,即將抽象類或介面指向其子類,前提是子類完全實現了繼承的抽象類或介面

(3)繼承他們的子類據需要完全實現他們宣告的方法才能例項化(對於抽象類已經實現的方法並不是必需要重寫)

不同的地方:

(1)乙個類可以繼承多個介面,但只能繼承乙個抽象類

(2)抽象類可以給出方法的實現,但是介面不可以,只能宣告方法存在留給繼承的子類實現

(3)介面裡的方法或變數必需是全部公開的,因為私有的沒意義,而抽象類裡可以有私有變數和方法

5、string s="";和string s=string.empty;

二者並沒有什麼區別,除錯時可發現string.empty其實也是"",所以這兩個其實是一樣的。

6、string和string

可以這樣理解,string是string的外號,兩者在絕大部分情況下是一樣的,只有一點不同,stirng無法做變數名而string可以。兩者到底有啥區別?

string是c#語言中的保留關鍵字,表示字串型別。而string是.net中的乙個類,在clr中並沒有string這個說法,只有string類,c#**在編譯後string均被當成string處理。int和int32亦是同樣的道理。

7、new

new用的最多的是新建物件或結構例項,但在c#中new關鍵字還有另外兩個作用,不經常用到,但也應知道,該知識點進入我視野起源於面試題,勾起回憶與clr via c#,園子裡已經有朋友特意寫過關於這個知識點的文章(傳送門:看了這位朋友的文章後自己思考了下,這裡加上一點我自己的補充:

(1)new在用於隱藏成員時並不是必需的,當在子類中重新定義成員時就隱式的隱藏了父類中的成員,若不用new編譯器會給出警告但是並不會報錯

(2)new用於隱藏基類中的成員時,只對基類中非私有的成員起作用(比如基類中有private int x=1;,子類中寫new private int x=2;並不會起到隱藏基類x的作用)

(3)若基類中有字段a和方法b,方法b用到了字段a,子類中只有a和b同時被隱藏這樣子類呼叫b方法時用到的才是子類中的重新定義的字段a,否則,若方法b在子類中並未被隱藏,那麼呼叫子類中的方法b時使用的仍然是基類中的字段a

(4)子類中被隱藏的成員與基類完全獨立,型別神馬的都可以改變,可見性當然也不在話下(這點與new無關,但是覺得挺重要,一併寫了)

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...