一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - 深入講解C++中的構(gòu)造函數(shù)

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

2021-03-13 15:31C++教程網(wǎng) C/C++

這篇文章主要介紹了C++中的構(gòu)造函數(shù),是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

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

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

一個構(gòu)造函數(shù)的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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)建對象
  Student stu("小明", 15, 90.5f); //傳參形式類似于函數(shù)調(diào)用
  stu.say();
  return 0;
}

運行結(jié)果:

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

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

讀者要注意:一旦在類中定義了構(gòu)造函數(shù),那么創(chuàng)建對象時一定會被執(zhí)行;如果構(gòu)造函數(shù)有參數(shù),創(chuàng)建對象時就要傳參。

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

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

?
1
Student(){}


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

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

一個構(gòu)造函數(shù)重載的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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)建對象時初始化成員變量
  Student stu1("小明", 15, 90.5f);
  stu1.say();
  
  //調(diào)用成員函數(shù)來初始化成員變量的值
  Student stu2;
  stu2.setname("李磊");
  stu2.setage(16);
  stu2.setscore(95);
  stu2.say();
  return 0;
}

運行結(jié)果:

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

類中定義了兩個構(gòu)造函數(shù),一個帶參數(shù)一個不帶參數(shù),它們是重載關(guān)系。當(dāng)根據(jù)不帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建對象時,不需要傳參,成員變量不會被初始化,所以要調(diào)用成員函數(shù)來設(shè)置它們的值。

C++帶參數(shù)的構(gòu)造函數(shù)
不帶參數(shù)的構(gòu)造函數(shù)使該類的每一個對象都得到相同的初始值。

如果希望對不同的對象賦予不同的初始值,則需要使用帶參數(shù)的構(gòu)造函數(shù),在調(diào)用不同對象的構(gòu)造函數(shù)時,將不同的數(shù)據(jù)傳給構(gòu)造函數(shù),以實現(xiàn)不同的初始化。

構(gòu)造函數(shù)首部的一般格式為:
 

?
1
構(gòu)造函數(shù)名(類型1 形參1, 類型2 形參2, …)


由于用戶是不能調(diào)用構(gòu)造函數(shù)的,因此無法采用常規(guī)的調(diào)用函數(shù)的方法給出實參。實參是在創(chuàng)建對象時給出的。創(chuàng)建對象的一般格式為:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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ù)//聲明計算體積的函數(shù)
Box::Box(int h,int w,int len) //在類外定義帶參數(shù)的構(gòu)造函數(shù)
{
  height=h;
  width=w;
  length=len;
}
int Box::volume( ) //定義計算體積的函數(shù)
{
  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;
}

程序運行結(jié)果如下:

?
1
2
The volume of box1 is 9000
The volume of box2 is 9450

可以知道:
帶參數(shù)的構(gòu)造函數(shù)中的形參,其對應(yīng)的實參在定義對象時給定。
用這種方法可以方便地實現(xiàn)對不同的對象進行不同的初始化。
用參數(shù)初始化表對數(shù)據(jù)成員初始化

上面介紹的是在構(gòu)造函數(shù)的函數(shù)體內(nèi)通過賦值語句對數(shù)據(jù)成員實現(xiàn)初始化。C++還提供另一種初始化數(shù)據(jù)成員的方法——參數(shù)初始化表來實現(xiàn)對數(shù)據(jù)成員的初始化。這種方法不在函數(shù)體內(nèi)對數(shù)據(jù)成員初始化,而是在函數(shù)首部實現(xiàn)。

例中定義構(gòu)造函數(shù)可以改用以下形式:

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


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

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現(xiàn)電腦關(guān)機程序

    C語言實現(xiàn)電腦關(guān)機程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電腦關(guān)機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

    本文給大家分享的是作者在學(xué)習(xí)使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 天天排行网 | 精品日本一区二区 | 免费一看一级毛片人 | www免费看| 午夜AV内射一区二区三区红桃视 | chinese特色video | 欧美肥b | 免费特黄一级欧美大片 | 国产精品九九免费视频 | 俄罗斯海滩厕所偷窥 | 色老大在线 | 日韩精品一区二区三区中文字幕 | 国产一区二区三区四卡 | 特黄aa级毛片免费视频播放 | 国产一区二区视频在线观看 | a毛片免费观看完整 | 99国产高清久久久久久网站 | 五月婷婷丁香在线视频 | 成人福利| 欧美美女被爆操 | 九九热这里只有精品2 | 亚洲精品午夜级久久久久 | 网址在线观看你懂我意思吧免费的 | 小柔的性放荡羞辱日记动漫 | 偷偷操不一样 | 四虎在线精品免费高清在线 | 国产91精品在线播放 | 236z最新伦理 | 小草高清视频免费直播 | 秋葵丝瓜茄子草莓榴莲樱桃 | 亚欧国产 | 国产a不卡片精品免费观看 国产aaa伦理片 | 久热人人综合人人九九精品视频 | 四虎网址大全 | 亚洲色图150p| 国产精品九九久久一区hh | japan孕妇孕交freehd | 日本精品久久久久中文字幕 1 | 9色视频在线观看 | 欧美日韩视频在线第一区二区三区 | 亚洲婷婷在线视频 |