程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++之類和對象的使用(一),對象使用

C++之類和對象的使用(一),對象使用

編輯:C++入門知識

C++之類和對象的使用(一),對象使用


  對象的初始化

在聲明類時直接對數據成員初始化是錯誤的!下面的例子時錯誤的!!

 

class Time{
hour =0;
minitu=0;
sec=0;
}  //因為類並不是一個實體,而是一種抽象類型,並不占存儲空間,顯然無處容納數據;

 

如果一個類中的所有成員都是public類型,則可以在定義對象的時候對數據成員初始化。

class Time{
public:
hour; minitu; sec; }; Time t1={13,12,40};//類似於結構體初始化成員,但僅限於public數據成員

  用構造函數實現數據成員的初始化

C++提供了構造函數來處理對象的初始化。構造函數是一種特殊的成員函數,與其他成員函數不同,不需要用戶來調用它,而是在建立對象時自動執行;構造函數的名字必須與類名相同,不具有任何類型,不具有返回值;

1)在類內定義構造函數

class Time{
public:
 Time(){
         hour =0;
         minitu=0;
         sec=0;
         }
} 

Time t1={13,12,40};

2)在類內聲明,在類外定義

class Time{
public:
 Time();//聲明構造函數
} 

Time::time()
{
hour=0;
minute=0;
sec=0;
}

構造函數的使用,有以下說明:

1)什麼時候調用構造函數?在建立對象的時候會自動調用構造函數。在建立對象時為該對象分配存儲單元,此時執行構造函數,就把指定的初值送到有關數據成員的存儲單元。每建立一個對象,就調用依次構造函數。

2)構造函數沒有返回值,也沒有類型,作用只是對對象進行初始化。

3)構造函數不需要用戶調用,也不被用戶調用。

4)可以用一個類對象初始化另一個對象。

Time t1; //建立對象t1,同時調用構造函數t1.Time()
Time t2=t1;//建立對象t2,並調用一個t1初始化t2

此時,把對象t1的各數據成員的值復制到t2相應的各成員,而不調用構造函數t2.Time();

5)在構造函數的函數體中不僅可以對數據成員賦初值,也可以包含其他語句,如cout語句,但是一般不提倡。

6)如果用戶沒有定義,則系統會自動生成一個構造函數,只是這個構造函數的函數體時空的,也沒有參數,不執行初始化操作;

  帶參數的構造函數

有時用戶希望對不同的對象賦予不同的初值,這就需要考慮帶參數的構造函數了。在調用不同對象的構造函數時,從外面將不同的數據傳遞給構造函數,以實現不同的初始化。構造函數首部的一般形式為:

構造函數名(形參1,形參2,......)

實參必須在定義對象時給出,定義對象的一般形式為:

類名  對象名(實參1,實參2,......)

#include<iostream>
using namespace std;

class Box
{public:
    Box(int,int,int);//聲明
    int volume();
 private:
     int height;
     int width;
     int length;
};
Box::Box() //類外定義
{
    height=h;
    width=w;
    length=len;
}

int Box::volume()
{
    return(height*width*length);
}

int mian()
{
    Box box1(14,12,48);//建立對象box1,給出實參
    cout<<"the box2 is:"<<box2.volume()<<endl;
        return 0;
 } 

1)帶參數的構造函數中的形參,其對應的實參是建立對象時給定的。即建立對象的同時指定數據成員的初值。

2)定義不同對象時用的實參是不同的,它們反應不同對象的屬性。用這種方法可以方便地實現對不同的對象進行不同的初始化。

  用參數初始化表對數據成員初始化

定義構造函數可以用如下形式:

類名::構造函數名([參數表])[:成員初始化表]{ [構造函數體]}//方括號內為可選項(可有可無)

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

  構造函數的重載

在一個類中可以定義多個構造函數,以便為對象提供不同的初始化的方法。這些構造函數有相同的名字,而參數的個數或參數的類型不同,稱為構造函數的重載。

#include<iostream>
using namespace std;

class Box
{public:
    Box();
    Box(int h,int w,int len):height(h),width(w),length(len){}
    int volume();
 private:
     int height;
     int width;
     int length;
};
Box::Box()
{
    height=10;
    width =10;
    length=10;
}

int Box::volume(){
    return(height*width*length);
}

int mian()
{
    Box box1;//建立對象box1,不指定實參
    cout<<"the box1 is:"<<box1.volume()<<endl;
    Box box2(14,12,48);
    cout<<"the box2 is:"<<box2.volume()<<endl;
    return 0;
 } 
///////////////////////////
Box::Box(int h)
Box::Box(int h,int w)

1)在建立對象時不必給出實參的構造函數,稱為默認構造函數。顯然,無參構造函數屬於默認構造函數;一個類只能有一個默認構造函數。

2)在建立對象時選用的是無參構造函數,應注意正確書寫定義對象的語句。構造函數是不能被用戶顯式調用的。

3)盡管在一個類中可以包含多個構造函數,但是對於每一個對象來說,建立對象時只執行其中一個構造函數。

  使用默認參數的構造函數

構造函數中參數的值既可以通過實參傳遞,也可以指定位某些默認值,即如果用戶不指定實參值,編譯系統就使形參默認值。

#include<iostream>
using namespace std;

class Box
{public:
    Box(int h=10,int w=10,int len=10);
    int volume();
 private:
     int height;
     int width;
     int length;
};
Box::Box()
{
    height=h;
    width=w;
    length=len;
}

int Box::volume(){
    return(height*width*length);
}

int mian()
{
    Box box1;
    cout<<"the box1 is:"<<box1.volume()<<endl;
        Box box2(14,12);
    cout<<"the box2 is:"<<box2.volume()<<endl;
    Box box3(14,12,48);
    cout<<"the box3 is:"<<box3.volume()<<endl;
    return 0;
 } 

說明:

1)應該在什麼地方指定構造函數的默認參數?應在聲明構造函數時指定默認值,而不是只能在定義構造函數時指定默認值。因為聲明是放在頭文件中,它是類的對外接口。

2)第五行等價於

 Box(int=10,int=10,int=10);//省去形參名

3)如果構造函數的全部參數都指定了默認值,則在定義對象時可以給一個或幾個實參,也可以不給出實參。可以不用參數而調用的構造函數,一個類只能有一個。下面是錯誤的!!

    Box();
    Box(int=10,int=10,int=10);

4)在一個類中定義了全部是默認參數的構造函數後,不能再定義重載構造函數。

Box(int=10,int=10,int=10); 
Box();
Box(int,int);
若有以下定義語句:
Box box1;//是調用上面第一個還是第二個構造函數??
Box box2(12,89);//是調用上面第一個還是第三個構造函數??

若有以下情況:

Box();
Box(int=10,int=10,int =10); 
Box(int,int);
若有以下定義語句:
Box box1;//正確,調用第一個
Box box2(12);//正確,調用第二個
Box box3(12,89);//錯誤,出現歧義

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved