A. 構造函數的有參和無參的區別,構造函數的參數是派什麼用場的
區別:
1.如果在創建對象時不寫參數,調用的就是無參的構造方法。可是如果你寫的有有參的構造方法,而沒有無參的構造方法,那麼再「創建對象時不寫參數」就會報錯,程序會認為你知道該怎麼做。
如果構造方法有參數,在創建對象時傳入了參數,那麼就會調用此方法,這一點和重載類似。
2.沒有參數的構造函數就是默認構造函數。
有參數的構造函數可用傳遞的參數給類中的屬性賦初始值或執行初始化操作例如訂閱事件等。
構造函數是在創建給定類型的對象時執行的類方法。構造函數具有與類相同的名稱,它通常初始化新對象的數據成員。
任何時候,只要創建類或結構,就會調用它的構造函數。類或結構可能有多個接受不同參數的構造函數。構造函數使得程序員可設置默認值、限制實例化以及編寫靈活且便於閱讀的代碼。
如果沒有為對象提供構造函數,則默認情況下 C# 將創建一個構造函數,該構造函數實例化對象,並將所有成員變數設置系統指定的默認值。靜態類和結構也可以有構造函數。
主要特點
1.構造函數的命名必須和類名完全相同。在java中普通函數可以和構造函數同名,但是必須帶有返回值;
2.構造函數的功能主要用於在類的對象創建時定義初始化的狀態。它沒有返回值,也不能用void來修飾。這就保證了它不僅什麼也不用自動返回,而且根本不能有任何選擇。而其他方法都有返回值,即使是void返回值。盡管方法體本身不會自動返回什麼,但仍然可以讓它返回一些東西,而這些東西可能是不安全的;
3.構造函數不能被直接調用,必須通過new運算符在創建對象時才會自動調用;而一般的方法是在程序執行到它的時候被調用的;
4.當定義一個類的時候,通常情況下都會顯示該類的構造函數,並在函數中指定初始化的工作也可省略,不過Java編譯器會提供一個默認的構造函數.此默認構造函數是不帶參數的。而一般的方法不存在這一特點;
5.構造函數有回滾的效果,構造函數拋出異常時,構造的是一個不完整對象,會回滾,將此不完整對象的成員釋放(c++)
6.當一個類只定義了私有的構造函數,將無法通過new關鍵字來創建其對象,當一個類沒有定義任何構造函數,C#編譯器會為其自動生成一個默認的無參的構造函數。
B. 對於一個類如果不定義構造方法,編譯器默認一個無參的構造方法,代碼中會顯示出嗎
不會,不過可以通過反匯編查看,但是如果你定了一個構造函數(無參獲帶參的)那麼原先默認的構造函數將自動被注銷
C. C++中,默認構造函數、無參構造函數、帶有默認值的構造函數,究竟怎麼區分
默認構造函數就是:在你不提供任何構造函數的情況下,系統給出的一個不帶參數,不包含函數代碼的構造函數。
在創建對象時調用構造函數,構造函數來初始化成員變數。可以有多個構造函數,他們的區別就是參數不同。所有可以用不同的構造函數初始化一個對象。
默認構造函數,就是調用構造函數時,不必給出實參的構造函數。
在一個類中定義了全部是默認參數的構造函數後,不能再定義重載構造函數。例:
Box(int =10,int =10,int =10);1
Box();2
Box(int,int);3
若有以下定義語句:
Box box1;//是調用上面的第一個默認參數的構造函數,還是第二個默認構造函數
Box box2(15,30);//是調用上面的第一個默認參數的構造函數,還是第三個構造函數
(3)編譯器生成的構造函數一定是無參的擴展閱讀:
第2個構造函數是最基本,最原始的構造函數;第1個就是形參都已默認,指定了的構造函數,調用時實參可以傳過去1個,2個,3個,甚至0個數據。
比如,第一個語句:Box box1;我們可以認為他是直接調用第2個構造函數,也可以認為他是調用了第1個構造函數,只不過沒有實參傳遞過去而已,這樣就產生了歧義。
同理,第二個語句,我們可以理解為它調用了第3 個構造函數。但同時,理解為它調用第1個構造函數,只不過僅傳過去2個實參,也是可是說得通的。這也就產生了歧義。
事實上,上面3個函數中任意一個都可以說是另兩個的重載函數,那麼「在一個類中定義了全部是默認參數的構造函數後,不能再定義重載構造函數」就很好容易理解了
D. C++ 編譯時如何根據是否存在無參構造函數決定是否調用該構造函數
根據你創建對象的方式,決定調用構造函數的類型
例如BASE a(10) BASE a
前者調用有一個參數的構造函數,後者調用無參數的構造函數
在類的聲明中如果你沒有寫構造函數,編譯器會為你提供一個無參數的默認構造函數
如果你聲明了構造函數,編譯器就不會給你提供無參數的構造函數
例如
class BASE {
}
class BASE{
BASE(int){}
}
前者會默認生成一個BASE(){}的構造函數、
後者則不會
如果你用後者去聲明一個對象
那麼你就必須為這個對象提供參數
如果你使用BASE a;聲明對象,就會報錯。
因為編譯器沒有給提供無參數的構造函數
希望我的解答能夠幫助到你,如滿意,請採納
E. 構造函數問題!
在C++中, 如果類中沒有定義構造函數, 那麼編譯器會自動生成一個默認的構造函數, 但是, 只要類里有定義一個或多個構造函數, 那麼編譯器就不會生成構造函數。
類里沒有定義預設的構造函數,並不表明沒有有參數的構造函數,編譯器會不會生成預設的構造函數是不確定的,所以你提的那句話是錯的。
F. C++類中 是不是一定會有構造函數呢編譯器生成的構造函數是不是一定能,初始化所以類中的成員
hh,是這樣的,只要你不定義類的對象,系統就不會調用構造函數(無論是系統的構造函數還是個人自己定義的),但是這個構造函數(系統的)是存在的,函數體是空的,什麼都不幹,只是把對象初始化為一個特定的狀態
G. 預設的構造函數就是沒有參數的構造函數嗎
預設就是默認,當你沒有為一個類顯示定義構造函數時,編譯器會默認給你生成一個無參構造函數。
H. 構造函數和默認構造函數有什麼區別
1.
構造函數的定義:
構造函數
,是一種特殊的方法。主要用來在創建對象時初始化對象,
即為對象成員變數賦初始值,總與new運算符一起使用在創建對象的語句中。特別的一個類可以有多個構造函數
,可根據其參數個數的不同或參數類型的不同來區分它們
即構造函數的重載。
2.
構造函數什麼時候使用:
在創建對象時調用構造函數,構造函數來初始化成員變數。可以有多個構造函數,他們的區別就是參數不同。所有可以用不同的構造函數初始化一個對象。
3.
默認的構造函數:
無參數,就是
對象1 = new 類1();4.
自己定義的構造函數:
有參數,比如
class A{
int a;
A();//默認是這樣
A(int aa){
a = aa;
};//自定義是這樣
}
對象aaa = new A();//默認構造
對象bbb = new A(250);// 自定義構造5.
自定義的構造函數可以靈活地初始化類內成員
I. Java構造函數 為什麼需要無參構造函數
補充下樓上的回答~~「但是如果你創造了一個帶有參數的構造方法,那麼無參的構造方法必須顯式的寫出來,否則會編譯失敗"這句話有點不妥,應該這么理解:每個類至少要有一個構造函數,如果你自己構建了一個帶有參數的構造函數而沒有再顯示的寫出無參的構造函數也是可以的,不過當你嘗試通過一個無參的構造函數來構建(new)時,此時編譯器才會報錯,因為找不到這個無參的構造函數。也就是說當一個類你沒有給他構造函數,則編譯器會自動補上一個無參的,若有的話就不會,你需要顯示將此無參的構造函數寫出來。
另一個問題:無參的構造函數,只是為了比較好的構造類(new),具體情況要根據你的類是如何設計的,呵呵。
J. 請問在Java類中, 什麼是無參的構造函數和默認的構造函數呢
當類沒有聲明構造方法的時候,就會使用默認的構造方法, 這個默認的構造方法就是「無參構造方法」
當類聲明了有參構造方法的時候,默認構造方法就失去了本身的作用。
publicclassClient{
publicstaticvoidmain(String[]args){
//聲明一個Cls3
Cls3cls3;
//獲取Cls3對象有兩種方式
{
cls3=newCls3();//使用無參構造對象
cls3=newCls3("有參");//使用有參構造對象
}
//聲明一個Cls2
Cls2cls2;
//獲取Cls2對象
{
//cls2=newCls2();//因為cls2隻有一個有參構造方法,使用無參構造方法構造對象會出現編譯錯誤。
cls2=newCls2("有參");//使用有參構造對象
}
//聲明一個Cls1
Cls1cls1;
{
cls1=newCls1();//使用無參構造對象
}
}
}
//定義一個默認構造方法的類
classCls1{
}
//定義一個有參的構造方法類
classCls2{
Cls2(Stringarg){
}
}
//定義一個有參和無參兩個構造方法的類
classCls3{
Cls3(){
}
Cls3(Stringarg){
}
}