亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入講解C++中的構造函數

2020-01-26 14:52:14
字體:
來源:轉載
供稿:網友

C++構造函數
當創建一個對象時,往往需要做一些初始化工作,例如對數據成員賦值等。為了解決這個問題,C++提供了構造函數。

構造函數(Constructor)是一種特殊的成員函數,它的名字和類名相同,沒有返回值,不需要用戶調用(用戶也不能調用),而是在創建對象時自動執行。構造函數的作用是在創建對象時進行初始化工作,最常見的就是對成員變量賦值。

一個構造函數的例子:

#include <iostream>using namespace std;class Student{private:  char *name;  int age;  float score;public:  //聲明構造函數  Student(char *, int, float);  //聲明普通成員函數  void say();};//定義構造函數Student::Student(char *name1, int age1, float score1){  name = name1;  age = age1;  score = score1;}//定義普通成員函數void Student::say(){  cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<endl;}int main(){  //根據構造函數創建對象  Student stu("小明", 15, 90.5f); //傳參形式類似于函數調用  stu.say();  return 0;}

運行結果:

小明的年齡是 15,成績是 90.5

在類中我們定義了一個構造函數 Student(),它的作用是給3個 private 屬性的成員變量賦值。在 main 函數中,我們根據構造函數創建了一個對象 stu;因為構造函數有參數,所以創建對象時要相應地傳入實參,形式類似于函數調用。

讀者要注意:一旦在類中定義了構造函數,那么創建對象時一定會被執行;如果構造函數有參數,創建對象時就要傳參。

另外,構造函數主要用來進行初始化,沒有返回值(有返回值沒有任何意義),這就意味著:
不管是聲明還是定義,函數名前面都不能出現返回值類型,即使是 void 也不允許;
函數體中不能有 return 語句。
默認構造函數

如果用戶自己沒有定義構造函數,那么編譯器會自動生成一個默認的構造函數,只是這個構造函數的函數體是空的,也沒有參數,不執行任何操作。比如上面的 Student 類,默認生成的構造函數如下:

Student(){}


一個類,必須有構造函數,要么用戶自己定義,要么編譯器自動生成。一旦用戶自己定義了構造函數,不管它是 public 屬性的,還是 private、protected 屬性的,編譯器都不再自動生成。上面的 Student 類,只有一個構造函數,就是我們自己定義的。
實際上,編譯器只有在必要的時候才會生成默認構造函數,而且它的函數體一般不為空。默認構造函數的目的是幫助編譯器做初始化工作,而不是幫助程序員。這是C++的內部實現機制,這里不再深究,初學者可以按照上面說的“一定有一個空函數體的默認構造函數”來理解。
構造函數的重載

和普通成員函數一樣,構造函數是允許重載的。一個類可以提供多個構造函數,讓用戶在創建對象時進行選擇,編譯器會根據創建對象時傳遞的參數來確定調用哪一個構造函數。也就是說:
只有一個構造函數會被執行;
創建對象時提供的參數必須和其中的一個構造函數匹配,否則編譯錯誤。

一個構造函數重載的例子:

#include <iostream>using namespace std;class Student{private:  char *name;  int age;  float score;public:  //聲明構造函數  Student();  Student(char *, int, float);  //聲明普通成員函數  void setname(char *);  void setage(int);  void setscore(float);  void say();};//定義構造函數Student::Student(){}Student::Student(char *name1, int age1, float score1){  name = name1;  age = age1;  score = score1;}//定義普通成員函數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(){  //創建對象時初始化成員變量  Student stu1("小明", 15, 90.5f);  stu1.say();    //調用成員函數來初始化成員變量的值  Student stu2;  stu2.setname("李磊");  stu2.setage(16);  stu2.setscore(95);  stu2.say();  return 0;}

運行結果:

小明的年齡是 15,成績是 90.5李磊的年齡是 16,成績是 95

類中定義了兩個構造函數,一個帶參數一個不帶參數,它們是重載關系。當根據不帶參數的構造函數創建對象時,不需要傳參,成員變量不會被初始化,所以要調用成員函數來設置它們的值。

C++帶參數的構造函數
不帶參數的構造函數使該類的每一個對象都得到相同的初始值。

如果希望對不同的對象賦予不同的初始值,則需要使用帶參數的構造函數,在調用不同對象的構造函數時,將不同的數據傳給構造函數,以實現不同的初始化。

構造函數首部的一般格式為:
 

  構造函數名(類型1 形參1, 類型2 形參2, …)


由于用戶是不能調用構造函數的,因此無法采用常規的調用函數的方法給出實參。實參是在創建對象時給出的。創建對象的一般格式為:

  類名 對象名(實參1, 實參2, …);

【例】有兩個長方柱,其長、寬、高分別為12, 20, 25和10, 14, 20,求它們的體積。編寫一個基于對象的程序,在類中用帶參數的構造函數。

#include <iostream>using namespace std;class Box{  public :  Box(int,int,int);  int volume( );  private :  int height;  int width;  int length;};//聲明帶參數的構造函數//聲明計算體積的函數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(12,25,30); //建立對象box1,并指定box1長、寬、高的值  cout<<"The volume of box1 is "<<box1.volume( )<<endl;  Box box2(15,30,21); //建立對象box2,并指定box2長、寬、高的值  cout<<"The volume of box2 is "<<box2.volume( )<<endl;  return 0;}

程序運行結果如下:

The volume of box1 is 9000The volume of box2 is 9450

可以知道:
帶參數的構造函數中的形參,其對應的實參在定義對象時給定。
用這種方法可以方便地實現對不同的對象進行不同的初始化。
用參數初始化表對數據成員初始化

上面介紹的是在構造函數的函數體內通過賦值語句對數據成員實現初始化。C++還提供另一種初始化數據成員的方法――參數初始化表來實現對數據成員的初始化。這種方法不在函數體內對數據成員初始化,而是在函數首部實現。

例中定義構造函數可以改用以下形式:

  Box::Box(int h,int w,int len):height(h),width(w), length(len){ }


這種寫法方便、簡練,尤其當需要初始化的數據成員較多時更顯其優越性。甚至可以直接在類體中(而不是在類外)定義構造函數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费小视频| 久久精品免费播放| 日韩av在线天堂网| 欧美精品电影免费在线观看| 成人av.网址在线网站| 日本中文字幕不卡免费| 久久99热精品| 国产精品老牛影院在线观看| 91色琪琪电影亚洲精品久久| 国语自产精品视频在线看抢先版图片| 国产一区二区三区在线视频| 亚洲国产精品久久久久秋霞不卡| www.国产一区| 亚洲天堂开心观看| 亚洲国产天堂网精品网站| 欧美成人午夜视频| yellow中文字幕久久| 国产精品一区二区久久精品| 亚洲片国产一区一级在线观看| 国产一区二区美女视频| 久久高清视频免费| 午夜精品一区二区三区在线视| 欧美激情乱人伦一区| 成人网在线观看| 尤物九九久久国产精品的特点| 日本欧美爱爱爱| 欧美午夜丰满在线18影院| 亚洲精品小视频在线观看| 人妖精品videosex性欧美| 日韩av不卡电影| 日韩免费观看av| 国产精品久久久久久久久久免费| 日韩在线视频线视频免费网站| 成人xxxx视频| 日韩精品视频在线免费观看| 国产精品一区久久久| 久久精品国产免费观看| 亚洲在线视频福利| 久久婷婷国产麻豆91天堂| 国产suv精品一区二区三区88区| 亚洲视频axxx| 欧美成人亚洲成人| 亚洲女同性videos| 成人精品福利视频| 欧美精品videossex88| 亚洲欧美三级在线| 97视频在线免费观看| 538国产精品一区二区在线| 久久精品99久久久香蕉| 亚洲成av人乱码色午夜| 欧美老女人性视频| 4p变态网欧美系列| 日韩精品极品在线观看播放免费视频| 亚洲综合中文字幕在线观看| 国产精品极品美女在线观看免费| 亚洲午夜国产成人av电影男同| 日韩欧美国产一区二区| 欧美国产亚洲视频| 成人黄色在线播放| 欧美性受xxxx白人性爽| 欧美怡春院一区二区三区| 色妞色视频一区二区三区四区| 久热国产精品视频| 成人午夜高潮视频| 91久久国产综合久久91精品网站| 久久亚洲国产精品| 日韩在线免费av| 在线观看欧美日韩| 久久久久亚洲精品国产| 国产视频精品va久久久久久| 欧美性猛交xxxx乱大交蜜桃| 亚洲一区二区日本| 日韩精品中文字幕在线| 伊是香蕉大人久久| 国产亚洲精品高潮| 成人精品久久一区二区三区| 日韩高清欧美高清| 色综合久久88| 91tv亚洲精品香蕉国产一区7ujn| 国产亚洲人成网站在线观看| 久久国产精品久久精品| 亚洲欧美日韩图片| 国产精品video| 国产精品美女在线| 2019中文字幕在线免费观看| 亚洲国产91精品在线观看| 亚洲国产精品电影| 成人欧美一区二区三区黑人| 91伊人影院在线播放| 黑人巨大精品欧美一区二区| 国产一区二区香蕉| 欧美电影免费观看大全| 欧美成人精品不卡视频在线观看| 亚洲欧洲中文天堂| 91国自产精品中文字幕亚洲| 亚洲成年人影院在线| 97在线视频观看| 国产精品久久久久久久久久久新郎| 亚洲精品美女在线观看播放| 红桃av永久久久| 久久免费在线观看| 久久久伊人日本| 久久久久国产精品www| 成人中心免费视频| 欧美人成在线视频| 亚洲国产三级网| 69**夜色精品国产69乱| 国产精品女主播视频| 美女啪啪无遮挡免费久久网站| 亚洲网站在线观看| 国产精品专区一| 日韩国产高清视频在线| 欧美一级在线亚洲天堂| 中文字幕日本欧美| 亚洲精品丝袜日韩| 国产欧美精品久久久| 日韩欧美在线看| 亚洲网站在线播放| 国产区精品在线观看| 2019中文字幕在线观看| 自拍偷拍亚洲精品| 国产精品女人久久久久久| 日韩视频第一页| 国色天香2019中文字幕在线观看| 久久亚洲春色中文字幕| 亚洲女人天堂视频| 欧美激情精品久久久久久免费印度| 成人免费激情视频| 亚洲www永久成人夜色| 国产盗摄xxxx视频xxx69| 动漫精品一区二区| 亚洲国产私拍精品国模在线观看| 亚洲a区在线视频| 国产欧美日韩免费看aⅴ视频| 91精品啪在线观看麻豆免费| 日韩免费在线电影| 欧洲美女7788成人免费视频| 欧美精品日韩三级| 久久久在线视频| 国产成人精品在线观看| 亚洲人成网站777色婷婷| 中文亚洲视频在线| 欧美日韩中文字幕| 国产精品激情av在线播放| 亚洲系列中文字幕| 国产精品久久久久久久久久久久久| 欧美精品久久久久久久| 日韩女优在线播放| 久久视频中文字幕| 亚洲国产精品va在线看黑人| 日韩电影免费观看在线观看| 色狠狠久久aa北条麻妃| 欧美大学生性色视频| 在线视频免费一区二区| 国产一区av在线| 成人做爽爽免费视频| 久久综合久中文字幕青草| 97久久精品人人澡人人爽缅北| 国产视频在线一区二区| 国产精品第3页| 国产精品天天狠天天看| 亚洲free性xxxx护士hd| 欧美亚洲国产成人精品| 日韩精品福利网站|