欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入講解C++中的構(gòu)造函數(shù)

 更新時(shí)間:2015年09月16日 16:23:01   投稿:goldensun  
這篇文章主要介紹了C++中的構(gòu)造函數(shù),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

C++構(gòu)造函數(shù)
當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),往往需要做一些初始化工作,例如對(duì)數(shù)據(jù)成員賦值等。為了解決這個(gè)問(wèn)題,C++提供了構(gòu)造函數(shù)。

構(gòu)造函數(shù)(Constructor)是一種特殊的成員函數(shù),它的名字和類名相同,沒(méi)有返回值,不需要用戶調(diào)用(用戶也不能調(diào)用),而是在創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的作用是在創(chuàng)建對(duì)象時(shí)進(jìn)行初始化工作,最常見(jià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<<",成績(jī)是 "<<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,成績(jī)是 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ù)主要用來(lái)進(jìn)行初始化,沒(méi)有返回值(有返回值沒(méi)有任何意義),這就意味著:
不管是聲明還是定義,函數(shù)名前面都不能出現(xiàn)返回值類型,即使是 void 也不允許;
函數(shù)體中不能有 return 語(yǔ)句。
默認(rèn)構(gòu)造函數(shù)

如果用戶自己沒(méi)有定義構(gòu)造函數(shù),那么編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的構(gòu)造函數(shù),只是這個(gè)構(gòu)造函數(shù)的函數(shù)體是空的,也沒(méi)有參數(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é)者可以按照上面說(shuō)的“一定有一個(gè)空函數(shù)體的默認(rèn)構(gòu)造函數(shù)”來(lái)理解。
構(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ù)來(lái)確定調(diào)用哪一個(gè)構(gòu)造函數(shù)。也就是說(shuō):
只有一個(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<<",成績(jī)是 "<<score<<endl;
}
int main(){
  //創(chuàng)建對(duì)象時(shí)初始化成員變量
  Student stu1("小明", 15, 90.5f);
  stu1.say();
  
  //調(diào)用成員函數(shù)來(lái)初始化成員變量的值
  Student stu2;
  stu2.setname("李磊");
  stu2.setage(16);
  stu2.setscore(95);
  stu2.say();
  return 0;
}

運(yùn)行結(jié)果:

小明的年齡是 15,成績(jī)是 90.5
李磊的年齡是 16,成績(jī)是 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ù)來(lái)設(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ù)的,因此無(wú)法采用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參。實(shí)參是在創(chuàng)建對(duì)象時(shí)給出的。創(chuàng)建對(duì)象的一般格式為:

  類名 對(duì)象名(實(shí)參1, 實(shí)參2, …);

【例】有兩個(gè)長(zhǎng)方柱,其長(zhǎng)、寬、高分別為12, 20, 25和10, 14, 20,求它們的體積。編寫(xiě)一個(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長(zhǎng)、寬、高的值
  cout<<"The volume of box1 is "<<box1.volume( )<<endl;
  Box box2(15,30,21); //建立對(duì)象box2,并指定box2長(zhǎng)、寬、高的值
  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)通過(guò)賦值語(yǔ)句對(duì)數(shù)據(jù)成員實(shí)現(xiàn)初始化。C++還提供另一種初始化數(shù)據(jù)成員的方法——參數(shù)初始化表來(lái)實(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){ }


這種寫(xiě)法方便、簡(jiǎn)練,尤其當(dāng)需要初始化的數(shù)據(jù)成員較多時(shí)更顯其優(yōu)越性。甚至可以直接在類體中(而不是在類外)定義構(gòu)造函數(shù)。

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)三子棋游戲含完整代碼

    C語(yǔ)言實(shí)現(xiàn)三子棋游戲含完整代碼

    本文詳細(xì)講解了C語(yǔ)言實(shí)現(xiàn)三子棋游戲內(nèi)含完整代碼,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • 詳解C++中的左值,純右值和將亡值

    詳解C++中的左值,純右值和將亡值

    C++中本身是存在左值,右值的概念,但是在C11中又出現(xiàn)了左值,純右值,將亡值得概念;這里我們主要介紹這些值的概念,感興趣的可以了解一下
    2022-09-09
  • C++數(shù)據(jù)結(jié)構(gòu)與算法之雙緩存隊(duì)列實(shí)現(xiàn)方法詳解

    C++數(shù)據(jù)結(jié)構(gòu)與算法之雙緩存隊(duì)列實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之雙緩存隊(duì)列實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了雙緩存隊(duì)列的原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++淺析STL?迭代器?容器的使用

    C++淺析STL?迭代器?容器的使用

    這篇文章主要介紹了C++?STL、迭代器、容器,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 基于C++自制屠夫躲貓貓小游戲

    基于C++自制屠夫躲貓貓小游戲

    這篇文章主要為大家詳細(xì)介紹了如何基于C++自制屠夫躲貓貓小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語(yǔ)言container of()函數(shù)案例詳解

    C語(yǔ)言container of()函數(shù)案例詳解

    這篇文章主要介紹了C語(yǔ)言container of()函數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C和C++ const的聲明差異

    C和C++ const的聲明差異

    本文給大家簡(jiǎn)單匯總了下C語(yǔ)言的const與C++的const的聲明差異,非常的簡(jiǎn)單,也很實(shí)用,有需要的小伙伴可以參考下
    2016-03-03
  • 使用UDP協(xié)議實(shí)現(xiàn)單詞翻譯服務(wù)器

    使用UDP協(xié)議實(shí)現(xiàn)單詞翻譯服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了如何使用UDP協(xié)議實(shí)現(xiàn)英文單詞翻譯服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-08-08
  • opencv3/C++ PHash算法圖像檢索詳解

    opencv3/C++ PHash算法圖像檢索詳解

    今天小編就為大家分享一篇opencv3/C++ PHash算法圖像檢索詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12

最新評(píng)論