[英]Constructor calling itself
最近發現無參數構造函數和多參數構造函數不能輪流調用。 這種限制的根本原因是什么? 有人可能會說構造函數是初始化資源的地方。 所以它們不能被遞歸調用。 我想知道這是否是唯一的原因。 函數/方法/過程可以遞歸調用。 為什么不是構造函數?
答案在於,對另一個構造函數的調用是任何構造函數的第一行,因此您的 if 中斷遞歸的條件將永遠不會被執行,因此堆棧溢出。
構造函數的主要目的是初始化特定類中描述的所有全局變量。
For Example:
public class Addition(){
int value1;
int value2;
public Addition(){ // default constructor
a=10;
b=10;
}
public Addition(int a, int b){
this(); // constructors having parameters , overloaded constructor
value1=a;
value2=b;
}
}
public class Main(){
public static void main(){
Addition addition = new Addition(); //or
Addition addition = new Addition(15,15);
}
}
在這里,如果要創建類的實例,可以通過調用默認構造函數或調用具有參數的構造函數來創建實例。 所以構造函數被重載而不是被覆蓋。 如果要調用另一個構造函數,只能將this()
或super()
放在構造函數的第一行中。 但這不是可取的。
構造函數不打算在對象初始化之外顯式調用,因為它在大多數(我猜是所有)語言中都受到限制。 相反,您可以創建一個額外的protected Init(...)
成員函數並在構造函數中調用它。
您關於構造函數不能調用其他構造函數的說法不適用於每種編程語言。 至少我知道 Java 可以做到這一點,而 C++ 不能。 但是您可以通過編寫私有 __init 函數並讓所有構造函數調用它來輕松克服此限制。
在您列出的所有語言中,對象都包含有限(通常很短)的屬性集。 每個屬性都可以包含遞歸結構(即列表),但它仍然由對象中的單個屬性表示。
我認為不需要遞歸調用構造函數。 感覺就像一個奇怪的使用遞歸來初始化幾個眾所周知的屬性。
正如您所說,您可以以非遞歸方式調用構造函數以在您提到的某些語言中共享代碼。
C#: 使用構造函數
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.