?結(jié)構(gòu)(struct) 與 類(class)
結(jié)構(gòu)與類很相似,都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu)。與類不同的是,結(jié)構(gòu)是值類型并且不需要堆分配。結(jié)構(gòu)類型的變量直接包含結(jié)構(gòu)的數(shù)據(jù),而類類型的變量包含對數(shù)據(jù)的引用(該變量稱為對象)。 struct 類型適合表示如點、矩形和顏色這樣的輕量對象。盡管可能將一個點表示為類,但結(jié)構(gòu)在某些方案中更有效。在一些情況下,結(jié)構(gòu)的成本較低。例如,如果聲明一個含有 1000 個點對象的數(shù)組,則將為引用每個對象分配附加的內(nèi)存。結(jié)構(gòu)可以聲明構(gòu)造函數(shù),但它們必須帶參數(shù)。聲明結(jié)構(gòu)的默認(rèn)(無參數(shù))構(gòu)造函數(shù)是錯誤的??偸翘峁┠J(rèn)構(gòu)造函數(shù)以將結(jié)構(gòu)成員初始化為它們的默認(rèn)值。在結(jié)構(gòu)中初始化實例字段是錯誤的。在類中,必須初始化實例對象. 使用 new 運算符創(chuàng)建結(jié)構(gòu)對象時,將創(chuàng)建該結(jié)構(gòu)對象,并且調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)。與類不同的是,結(jié)構(gòu)的實例化可以不使用 new 運算符。如果不使用 new,那么在初始化所有字段之前,字段將保持未賦值狀態(tài)且對象不可用。對于結(jié)構(gòu),不像類那樣存在繼承。一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基。但是,結(jié)構(gòu)從基類 Object 繼承。
結(jié)構(gòu)可實現(xiàn)接口,其方式同類完全一樣。
一個是值類型(結(jié)構(gòu)),一個是引用類型(類),結(jié)構(gòu)在傳遞的時候如果沒有指定ref,則傳遞的是內(nèi)存中的一分副本,而class則是傳遞對他的引用。
類在堆中,結(jié)構(gòu)在棧中,類傳遞的是類在堆中的地址,而結(jié)構(gòu)是在棧中另復(fù)制了一個傳遞,你改變傳遞過來的結(jié)構(gòu)不會影響原結(jié)構(gòu)。而類是引用,共用一塊內(nèi)存,會改變堆中類的內(nèi)容.?
??