【轉載】預設建構函式和建構函式過載
轉載自:https://blog.csdn.net/simon_2011/article/details/78129898
作者:simon_syeming
本文主要總結了預設建構函式的相關用法和建構函式過載,旨在能夠對平時的專案開發起到一定的夯實基本功的作用,言簡意賅,一目瞭然。
首先需要了解建構函式是用來做什麼?該類物件被建立時,編譯器為物件分配記憶體空間,並自動呼叫該建構函式,由建構函式完成資料成員的初始化工作。
一、預設建構函式
- 從程式碼層面進行分析
class testClass { public : testClass();//不帶引數的預設建構函式--------- testClass(int a, char b);//建構函式 testClass(int a = 0, char b = 'c');//引數都有預設值的預設建構函式------- private: int m_a; char m_b; };
- 預設建構函式主要用來完成如下形式的初始化
testClass classA;
//或者
testClass *classA = new testClass;
在這種情況下,如果沒有提供預設建構函式也就是以上兩種預設建構函式其中的一種,編譯器會報錯。
- 兩種方式的預設建構函式
1)、定義一個無引數的建構函式;
2)、定義所有引數都有預設值得建構函式。
注意:一個類只能有一個預設建構函式。也就是說上述兩種方式定義的預設建構函式不能同時出現,一般選擇testClass(); 這種形式的預設建構函式。只有程式設計師定義了建構函式,編譯器就不會再提供預設構造函數了。所以程式設計師最好再手動定 義一個預設建構函式,以防止出現testClass classA;這樣的錯誤。
讀者朋友可以試著修改靜態成員變數和靜態成員函式在C++類中的作用中的例子,試著建立Myclass類的物件,因為程式碼 中定義了建構函式,所以編譯器沒有提供預設的建構函式,所以編譯會報錯,大家可以試著修改一下。
- 舉例說明——求盒子的容積
#include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在宣告建構函式時指定預設引數--預設建構函式 int volume( ); private : int height; int width; int length; }; Box::Box(int h,int w,int len) { height=h; width=w; length=len; } //或者 //Box::Box(int h,int w,int len):height(h),width(w),length(len) //{ // //} int Box::volume( ) { return (height*width*length); } int main( ) { Box box1; //沒有給實參 cout<<"The volume of box1 is "<<box1.volume( )<<endl; Box box2(15); //只給定一個實參 cout<<"The volume of box2 is "<<box2.volume( )<<endl; Box box3(15,30); //只給定2個實參 cout<<"The volume of box3 is "<<box3.volume( )<<endl; Box box4(15,30,20); //給定3個實參 cout<<"The volume of box4 is "<<box4.volume( )<<endl; return 0; }
可以看到,在建構函式中使用預設引數是方便而有效的,它提供了建立物件時的多種選擇,它的作用相當於好幾個過載的建構函式。 它的好處是,即使在呼叫建構函式時沒有提供實參值,不僅不會出錯,而且還確保按照預設的引數值對物件進行初始化。尤其在希望對每一個物件都有同樣的初始化狀況時用這種方法更為方便。
二、建構函式過載
在一個類中可以定義多個建構函式,以便提供不同的初始化的方法,供使用者選用。這些建構函式具有相同的名字,而引數的個數或引數的型別不相同。這稱為建構函式的過載。
#include <iostream>
using namespace std;
class Box {
public :
Box(); //宣告一個無參的建構函式
//Box(int h); //有1個引數的建構函式
//Box(int h,int w); //有兩個引數的建構函式
Box(int h, int w, int len) :height(h), width(w), length(len);//宣告一個有參的建構函式,用引數的初始化表對資料成員初始化
int volume( );
private :
int height;
int width;
int length;
};
Box::Box() //定義一個無參的建構函式
{
height=10;
width=10;
length=10;
}
//Box::Box(int h)
//{
//
//}
//
//Box::Box(int h,int w)
//{
//
//}
Box::Box(int h, int w, int len) :height(h), width(w), length(len)
{
}
int Box::volume( )
{
return (height*width*length);
}
int main( )
{
Box box1; //建立物件box1,不指定實參
cout<<"The volume of box1 is "<<box1.volume( )<<endl;
Box box4(15,30,25); //建立物件box4,指定3個實參
cout<<"The volume of box4 is "<<box4.volume( )<<endl;
return 0;
}
以上程式碼定義了四個過載建構函式,在建立物件時不指定引數,或者分別給定1個引數,2個引數和3個引數。
關於建構函式的過載的幾點說明:
1、呼叫建構函式時不必給出實參的建構函式,稱為預設建構函式(default constructor)。顯然,無參的建構函式屬於預設建構函式。一個類只能有一個預設建構函式。如果在建立物件時選用的是無參建構函式,應注意正確書寫定義物件的語句。
2、儘管在一個類中可以包含多個建構函式,但是對於每一個物件來說,建立物件時只執行其中一個建構函式,並非每個建構函式都被執行。
---------------------
作者:simon_syeming
來源:CSDN
原文:https://blog.csdn.net/simon_2011/article/details/78129898
版權宣告:本文為博主原創文章,轉載請附上博文連結!