建構函式主要用來初始化物件。它又分為靜態
(static)
和例項(instance)
建構函式兩種類別。大家應該都了解如果來寫類的建構函式,這裡只說下預設建構函式的作用,以及在類中保留預設建構函式的重要性。實際上,我說錯了。正確的說法是:以及在類中保留空引數建構函式的重要性。
我們來寫乙個類
a,**如下:
public class a
//在test
類中例項化
public class test
"nword = 」,a.number,a.word);
console.read();}
} 輸出的結果是:
number = 0
word =
在上列示例中,我們並沒有在
a類中明確的寫出建構函式,當我們沒有提供任何建構函式時,
c#自動為類提供了乙個預設建構函式,其格式為:
public a()
這個預設建構函式看起來似乎根本沒什麼作用,沒有接收任何輸入引數,方法體也是個空的。那麼它真的是無所事事,可有可無的乙個東西嗎?我們回想下前面所講的建構函式的主要作用,對,它主要用來初始化物件。看下輸出結果,
int型別的
number
被初始化為預設值0,
string
型別的word
被初始化為預設值空白字元,這些工作都是由看似沒起作用的預設建構函式所完成的。
很快,a
類的設計讓我們並不滿意,我們加強了它的能力,自己提供了建構函式:
public class a
} //test
類也重新設計
public class test
"nword = 」,a.number,a.word);
console.read();}
} 輸出結果:
number = 100
word =
一百執行很順利,結果正確。當我們提供了建構函式時,
c#認為我們應該是意識到、並且有能力來做好類的初始化工作,於是它將預設的建構函式撤銷,將控制權交到了我們手裡。我們自己的建構函式能勝任預設建構函式的工作嗎?帶著懷疑,我們做個嘗試,將類
a建構函式的方法體清除,即注釋掉標記1和
2行,重新執行,輸出的結果是:
number =0
word =
這個結果和呼叫預設建構函式的結果是一樣的,這證明我們自己提供的建構函式能擔當預設建構函式的工作。
不久以後,業務進一步擴充套件,我們要新構乙個類,這個類繼承自類
a,我們把它稱為類b:
public class a
} public class b:a
} //修改
test
類public class test
"nword = 」,b.number,b.word);
console.read();}}
執行後出錯,錯誤資訊是:「
a」方法沒有採用「
0」個引數的過載。為什麼會這樣呢?看起來我們並沒有什麼錯誤呀。
a類提供了建構函式,
b類也提供了建構函式。你滿腹委屈,含淚望著比爾蓋茨。老比怒目圓睜,啪的給你一巴掌:「
a類還沒構造好,你讓我怎麼給你構造
b類!」。
a類?構造?
a類還要構造嗎?你莫名奇妙了。
事實上,
b類要完成構造,必須先完成
a類的構造。當我們採用:
public b(int number,string word)
來構造b類時,由於沒有明確指明繼承的構造方法,
c #預設我們繼承自預設建構函式。
public b(int number,string word)
:base()
採用這條建構函式時,
c# 先呼叫類
a的預設建構函式
base()
完成基類的構造,然後呼叫
b類的建構函式完成針對
b類構造的剩餘工作。嘗試修改上面的相應**段為:
//在類
a中新增乙個空參建構函式
public class a
…….}
//將類
b建構函式改為繼承
a類空參構造
public b(int number,string word):base()
實際上,我是多此一舉了,
public b(……):base()
與public b(……)
是一樣的,未顯式指明建構函式的繼承體時,
c#就預設為
base()
。輸出結果
number=100
word =
一百注意看我們給
a類新增的空參建構函式,我們在方法體內給
number賦值1
,給word
賦值「空參構造」。然而從輸出結果看,這些賦值都被覆蓋了。這就說明,
base()
在前,而後才是
public b(…..)
。回頭來看我們那個錯誤的例子。遺憾的是,我們在類
a中自己提供了建構函式,這導致
a類的預設建構函式消失了,當b類從
a類繼承預設建構函式時,找不到入口了,這就導致了如上的錯誤。如果要避免錯誤,有兩種方法:1、在
a類中新增乙個無引數的建構函式。2、
b類建構函式顯式繼承
a類的建構函式。
事情已經解釋的很清楚了,不過也許還有個小問題,就是:在
b類中,我們提供了乙個和
a類建構函式結構相同的建構函式,為什麼
c#不能自動識別,自動繼承呢?
道理很簡單,
c#不能靠猜測來判斷我們提供的引數究竟是要用作初始化基類還是繼承類。還是來看乙個例子:
public class a }
public class b:a }
public class test
"nword = "nname = 」,
b.number,b.word,b.name);
console.read();}
} 輸出結果是:
number = 100
word =
一百name =
初始化b
的引數注意在
b類的建構函式中,我們提供了三個引數,其中前兩個用於初始化
a類中的成員,第三個用於初始化
b類的成員。雖然父類建構函式與子類建構函式的引數數量不一樣,然而由於我們明確的指定了繼承的關係,它們很好的完成了工作。
建構函式的作用 php建構函式的作用
建構函式的作用是什麼?為了讓你更好的理解,我舉工廠的例子開始講起 我們知道,在乙個工廠裡面,要生產同要求的產品,那麼就需要cad模具。如果引申到我們的php中,我們可以理解為類就是cad模具,決定了產品的形狀 而物件就是產品 要求 長度 寬度 高度 半徑等等指標 就是類中的類的屬性。當我們要生產產品...
建構函式 解析建構函式的作用
建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件 成員變數 賦初始值,總與new 運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的 過載。那麼,為什麼要在建立物件時初始化物件呢?又是如何實現的呢?接下...
拷貝建構函式的作用
拷貝建構函式首先是乙個建構函式,它呼叫的時候產生乙個物件,是通過引數傳進來的那個物件來初始化,產生的物件。operator 是把乙個物件賦值給乙個原有的物件,所以如果原來的物件中有記憶體分配要先把記憶體釋放掉,而且還要檢查一下兩個物件是不是同乙個物件,如果是的話就不做任何操作。還要注意的是拷貝建構函...