解析C++中構(gòu)造函數(shù)的默認參數(shù)和構(gòu)造函數(shù)的重載
C++構(gòu)造函數(shù)的默認參數(shù)
和普通函數(shù)一樣,構(gòu)造函數(shù)中參數(shù)的值既可以通過實參傳遞,也可以指定為某些默認值,即如果用戶不指定實參值,編譯系統(tǒng)就使形參取默認值。
【例】
#include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在聲明構(gòu)造函數(shù)時指定默認參數(shù) int volume( ); private : int height; int width; int length; }; Box::Box(int h,int w,int len) //在定義函數(shù)時可以不指定默認參數(shù) { 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; }
程序運行結(jié)果為:
The volume of box1 is 1000 The volume of box2 is 1500 The volume of box3 is 4500 The volume of box4 is 9000
程序中對構(gòu)造函數(shù)的定義(第12-16行)也可以改寫成參數(shù)初始化表的形式:
Box::Box(int h,int w,int len):height(h),width(w),length(len){ }
可以看到,在構(gòu)造函數(shù)中使用默認參數(shù)是方便而有效的,它提供了建立對象時的多種選擇,它的作用相當于好幾個重載的構(gòu)造函數(shù)。
它的好處是,即使在調(diào)用構(gòu)造函數(shù)時沒有提供實參值,不僅不會出錯,而且還確保按照默認的參數(shù)值對對象進行初始化。尤其在希望對每一個對象都有同樣的初始化狀況時用這種方法更為方便。
關(guān)于構(gòu)造函數(shù)默認值的幾點說明:
應(yīng)該在聲明構(gòu)造函數(shù)時指定默認值,而不能只在定義構(gòu)造函數(shù)時指定默認值。
程序第5行在聲明構(gòu)造函數(shù)時,形參名可以省略。
如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認值,則在定義對象時可以給一個或幾個實參,也可以不給出實參。
在一個類中定義了全部是默認參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù)。
C++構(gòu)造函數(shù)的重載
在一個類中可以定義多個構(gòu)造函數(shù),以便提供不同的初始化的方法,供用戶選用。這些構(gòu)造函數(shù)具有相同的名字,而參數(shù)的個數(shù)或參數(shù)的類型不相同。這稱為構(gòu)造函數(shù)的重載。
通過下面的例子可以了解怎樣應(yīng)用構(gòu)造函數(shù)的重載。
【例】定義兩個構(gòu)造函數(shù),其中一個無參數(shù),一個有參數(shù)。
#include <iostream> using namespace std; class Box { public : Box( ); //聲明一個無參的構(gòu)造函數(shù) //聲明一個有參的構(gòu)造函數(shù),用參數(shù)的初始化表對數(shù)據(jù)成員初始化 Box(int h,int w,int len):height(h),width(w),length(len){ } int volume( ); private : int height; int width; int length; }; Box::Box( ) //定義一個無參的構(gòu)造函數(shù) { height=10; width=10; length=10; } int Box::volume( ){ return (height*width*length); } int main( ) { Box box1; //建立對象box1,不指定實參 cout<<"The volume of box1 is "<<box1.volume( )<<endl; Box box2(15,30,25); //建立對象box2,指定3個實參 cout<<"The volume of box2 is "<<box2.volume( )<<endl; return 0; }
在本程序中定義了兩個重載的構(gòu)造函數(shù),其實還可以定義其他重載構(gòu)造函數(shù),其原型聲明可以為:
Box::Box(int h); //有1個參數(shù)的構(gòu)造函數(shù) Box::Box(int h,int w); //有兩個參數(shù)的構(gòu)造函數(shù)
在建立對象時分別給定1個參數(shù)和2個參數(shù)。
關(guān)于構(gòu)造函數(shù)的重載的幾點說明:
調(diào)用構(gòu)造函數(shù)時不必給出實參的構(gòu)造函數(shù),稱為默認構(gòu)造函數(shù)(default constructor)。顯然,無參的構(gòu)造函數(shù)屬于默認構(gòu)造函數(shù)。一個類只能有一個默認構(gòu)造函數(shù)。
如果在建立對象時選用的是無參構(gòu)造函數(shù),應(yīng)注意正確書寫定義對象的語句。
盡管在一個類中可以包含多個構(gòu)造函數(shù),但是對于每一個對象來說,建立對象時只執(zhí)行其中一個構(gòu)造函數(shù),并非每個構(gòu)造函數(shù)都被執(zhí)行。
- C++類成員構(gòu)造函數(shù)和析構(gòu)函數(shù)順序示例詳細講解
- 深入解析C++中的構(gòu)造函數(shù)和析構(gòu)函數(shù)
- C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解
- c++類構(gòu)造函數(shù)詳解
- 深入C++中構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值操作符、析構(gòu)函數(shù)的調(diào)用過程總結(jié)
- c++中拷貝構(gòu)造函數(shù)的參數(shù)類型必須是引用
- C++中拷貝構(gòu)造函數(shù)的應(yīng)用詳解
- C++11委托構(gòu)造函數(shù)和繼承構(gòu)造函數(shù)的實現(xiàn)
相關(guān)文章
C++中實現(xiàn)多態(tài)有幾種方式小結(jié)
在C++中,多態(tài)是一種面向?qū)ο缶幊痰奶匦?允許以統(tǒng)一的方式處理不同類型的對象,并根據(jù)實際對象的類型來執(zhí)行相應(yīng)的操作,本文給大家介紹了C++中實現(xiàn)多態(tài)有幾種方式小結(jié),需要的朋友可以參考下2024-12-12詳解如何將Spire.Doc for C++集成到C++程序中
Spire.Doc for C++是一個專業(yè)的Word庫,供開發(fā)人員在任何類型的C++應(yīng)用程序中閱讀、創(chuàng)建、編輯、比較和轉(zhuǎn)換 Word 文檔,本文演示了如何以兩種不同的方式將 Spire.Doc for C++ 集成到您的 C++ 應(yīng)用程序中,希望對大家有所幫助2023-05-05C++ 基礎(chǔ)編程之十進制轉(zhuǎn)換為任意進制及操作符重載
這篇文章主要介紹了C++ 基礎(chǔ)編程之十進制轉(zhuǎn)換為任意進制及操作符重載的相關(guān)資料,需要的朋友可以參考下2017-02-02