深入講解C++中的構(gòu)造函數(shù)
C++構(gòu)造函數(shù)
當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),往往需要做一些初始化工作,例如對(duì)數(shù)據(jù)成員賦值等。為了解決這個(gè)問題,C++提供了構(gòu)造函數(shù)。
構(gòu)造函數(shù)(Constructor)是一種特殊的成員函數(shù),它的名字和類名相同,沒有返回值,不需要用戶調(diào)用(用戶也不能調(diào)用),而是在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的作用是在創(chuàng)建對(duì)象時(shí)進(jìn)行初始化工作,最常見的就是對(duì)成員變量賦值。
一個(gè)構(gòu)造函數(shù)的例子:
#include <iostream> using namespace std; class Student{ private: char *name; int age; float score; public: //聲明構(gòu)造函數(shù) Student(char *, int, float); //聲明普通成員函數(shù) void say(); }; //定義構(gòu)造函數(shù) Student::Student(char *name1, int age1, float score1){ name = name1; age = age1; score = score1; } //定義普通成員函數(shù) void Student::say(){ cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<endl; } int main(){ //根據(jù)構(gòu)造函數(shù)創(chuàng)建對(duì)象 Student stu("小明", 15, 90.5f); //傳參形式類似于函數(shù)調(diào)用 stu.say(); return 0; }
運(yùn)行結(jié)果:
小明的年齡是 15,成績是 90.5
在類中我們定義了一個(gè)構(gòu)造函數(shù) Student(),它的作用是給3個(gè) private 屬性的成員變量賦值。在 main 函數(shù)中,我們根據(jù)構(gòu)造函數(shù)創(chuàng)建了一個(gè)對(duì)象 stu;因?yàn)闃?gòu)造函數(shù)有參數(shù),所以創(chuàng)建對(duì)象時(shí)要相應(yīng)地傳入實(shí)參,形式類似于函數(shù)調(diào)用。
讀者要注意:一旦在類中定義了構(gòu)造函數(shù),那么創(chuàng)建對(duì)象時(shí)一定會(huì)被執(zhí)行;如果構(gòu)造函數(shù)有參數(shù),創(chuàng)建對(duì)象時(shí)就要傳參。
另外,構(gòu)造函數(shù)主要用來進(jìn)行初始化,沒有返回值(有返回值沒有任何意義),這就意味著:
不管是聲明還是定義,函數(shù)名前面都不能出現(xiàn)返回值類型,即使是 void 也不允許;
函數(shù)體中不能有 return 語句。
默認(rèn)構(gòu)造函數(shù)
如果用戶自己沒有定義構(gòu)造函數(shù),那么編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的構(gòu)造函數(shù),只是這個(gè)構(gòu)造函數(shù)的函數(shù)體是空的,也沒有參數(shù),不執(zhí)行任何操作。比如上面的 Student 類,默認(rèn)生成的構(gòu)造函數(shù)如下:
Student(){}
一個(gè)類,必須有構(gòu)造函數(shù),要么用戶自己定義,要么編譯器自動(dòng)生成。一旦用戶自己定義了構(gòu)造函數(shù),不管它是 public 屬性的,還是 private、protected 屬性的,編譯器都不再自動(dòng)生成。上面的 Student 類,只有一個(gè)構(gòu)造函數(shù),就是我們自己定義的。
實(shí)際上,編譯器只有在必要的時(shí)候才會(huì)生成默認(rèn)構(gòu)造函數(shù),而且它的函數(shù)體一般不為空。默認(rèn)構(gòu)造函數(shù)的目的是幫助編譯器做初始化工作,而不是幫助程序員。這是C++的內(nèi)部實(shí)現(xiàn)機(jī)制,這里不再深究,初學(xué)者可以按照上面說的“一定有一個(gè)空函數(shù)體的默認(rèn)構(gòu)造函數(shù)”來理解。
構(gòu)造函數(shù)的重載
和普通成員函數(shù)一樣,構(gòu)造函數(shù)是允許重載的。一個(gè)類可以提供多個(gè)構(gòu)造函數(shù),讓用戶在創(chuàng)建對(duì)象時(shí)進(jìn)行選擇,編譯器會(huì)根據(jù)創(chuàng)建對(duì)象時(shí)傳遞的參數(shù)來確定調(diào)用哪一個(gè)構(gòu)造函數(shù)。也就是說:
只有一個(gè)構(gòu)造函數(shù)會(huì)被執(zhí)行;
創(chuàng)建對(duì)象時(shí)提供的參數(shù)必須和其中的一個(gè)構(gòu)造函數(shù)匹配,否則編譯錯(cuò)誤。
一個(gè)構(gòu)造函數(shù)重載的例子:
#include <iostream> using namespace std; class Student{ private: char *name; int age; float score; public: //聲明構(gòu)造函數(shù) Student(); Student(char *, int, float); //聲明普通成員函數(shù) void setname(char *); void setage(int); void setscore(float); void say(); }; //定義構(gòu)造函數(shù) Student::Student(){} Student::Student(char *name1, int age1, float score1){ name = name1; age = age1; score = score1; } //定義普通成員函數(shù) void Student::setname(char *name1){ name = name1; } void Student::setage(int age1){ age = age1; } void Student::setscore(float score1){ score = score1; } void Student::say(){ cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<endl; } int main(){ //創(chuàng)建對(duì)象時(shí)初始化成員變量 Student stu1("小明", 15, 90.5f); stu1.say(); //調(diào)用成員函數(shù)來初始化成員變量的值 Student stu2; stu2.setname("李磊"); stu2.setage(16); stu2.setscore(95); stu2.say(); return 0; }
運(yùn)行結(jié)果:
小明的年齡是 15,成績是 90.5 李磊的年齡是 16,成績是 95
類中定義了兩個(gè)構(gòu)造函數(shù),一個(gè)帶參數(shù)一個(gè)不帶參數(shù),它們是重載關(guān)系。當(dāng)根據(jù)不帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),不需要傳參,成員變量不會(huì)被初始化,所以要調(diào)用成員函數(shù)來設(shè)置它們的值。
C++帶參數(shù)的構(gòu)造函數(shù)
不帶參數(shù)的構(gòu)造函數(shù)使該類的每一個(gè)對(duì)象都得到相同的初始值。
如果希望對(duì)不同的對(duì)象賦予不同的初始值,則需要使用帶參數(shù)的構(gòu)造函數(shù),在調(diào)用不同對(duì)象的構(gòu)造函數(shù)時(shí),將不同的數(shù)據(jù)傳給構(gòu)造函數(shù),以實(shí)現(xiàn)不同的初始化。
構(gòu)造函數(shù)首部的一般格式為:
構(gòu)造函數(shù)名(類型1 形參1, 類型2 形參2, …)
由于用戶是不能調(diào)用構(gòu)造函數(shù)的,因此無法采用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參。實(shí)參是在創(chuàng)建對(duì)象時(shí)給出的。創(chuàng)建對(duì)象的一般格式為:
類名 對(duì)象名(實(shí)參1, 實(shí)參2, …);
【例】有兩個(gè)長方柱,其長、寬、高分別為12, 20, 25和10, 14, 20,求它們的體積。編寫一個(gè)基于對(duì)象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。
#include <iostream> using namespace std; class Box { public : Box(int,int,int); int volume( ); private : int height; int width; int length; }; //聲明帶參數(shù)的構(gòu)造函數(shù)//聲明計(jì)算體積的函數(shù) Box::Box(int h,int w,int len) //在類外定義帶參數(shù)的構(gòu)造函數(shù) { height=h; width=w; length=len; } int Box::volume( ) //定義計(jì)算體積的函數(shù) { return (height*width*length); } int main( ) { Box box1(12,25,30); //建立對(duì)象box1,并指定box1長、寬、高的值 cout<<"The volume of box1 is "<<box1.volume( )<<endl; Box box2(15,30,21); //建立對(duì)象box2,并指定box2長、寬、高的值 cout<<"The volume of box2 is "<<box2.volume( )<<endl; return 0; }
程序運(yùn)行結(jié)果如下:
The volume of box1 is 9000 The volume of box2 is 9450
可以知道:
帶參數(shù)的構(gòu)造函數(shù)中的形參,其對(duì)應(yīng)的實(shí)參在定義對(duì)象時(shí)給定。
用這種方法可以方便地實(shí)現(xiàn)對(duì)不同的對(duì)象進(jìn)行不同的初始化。
用參數(shù)初始化表對(duì)數(shù)據(jù)成員初始化
上面介紹的是在構(gòu)造函數(shù)的函數(shù)體內(nèi)通過賦值語句對(duì)數(shù)據(jù)成員實(shí)現(xiàn)初始化。C++還提供另一種初始化數(shù)據(jù)成員的方法——參數(shù)初始化表來實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化。這種方法不在函數(shù)體內(nèi)對(duì)數(shù)據(jù)成員初始化,而是在函數(shù)首部實(shí)現(xiàn)。
例中定義構(gòu)造函數(shù)可以改用以下形式:
Box::Box(int h,int w,int len):height(h),width(w), length(len){ }
這種寫法方便、簡練,尤其當(dāng)需要初始化的數(shù)據(jù)成員較多時(shí)更顯其優(yōu)越性。甚至可以直接在類體中(而不是在類外)定義構(gòu)造函數(shù)。
上一篇:詳解C++編程中類模板的相關(guān)使用知識(shí)
欄 目:C語言
本文標(biāo)題:深入講解C++中的構(gòu)造函數(shù)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2707.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10深入解析最長公共子串
- 01-10c++中inline的用法分析
- 01-10深入理解鏈表的各類操作詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改