1. 程式人生 > >C++類和物件例項解析

C++類和物件例項解析

C++既是面向物件也是面向過程的語言,在這裡就有一個重要的概念——
        何謂類?類是對物件的一種抽象,舉例來講:每一個實實在在存在的人就是一個物件,人有很多共同的特徵(一個頭,兩條腿,能走,能跑),這具有共同特徵的人就成為一個類。類是一個抽象的名詞,每一個人(即物件)是這個類的例項。
        物件間具有的共同特徵是物件的屬性和行為。錄影機是一個物件,它的屬性是生產廠家、牌子、重量、顏色等等,它的行為就是它的功能,如錄影、放像、快進、倒退等操作。
C++程式中,需要先定義一個類,形如:
  Class 類名
     { 
        定義變數;
        ….
        定義函式
      }
在類體中時成員列表,包括資料和操作資料的函式,即資料成員、成員函式。這體現了類的封裝性和資訊的隱蔽性。
成員函式一般在類體中宣告,在類體外定義。
建構函式:對物件進行賦值
解構函式:在函式功能域結束時,釋放物件成員的空間。
行內函數:為了節省函式呼叫的時間
完成各種功能函式…….
定義物件就需要對類進行例項化。形如:類名物件名

        類是一個抽象,它不佔任何記憶體,只有當其例項化成為物件之後,才會給其分配空間。
        計算機中就是用物件來描述大千世界的事物。物件之間通過訊息建立聯絡,藉助函式完成各種各樣的功能。
簡單的說,這就是物件和類。

下面通過例項理解

【2-1】定義一個日C++類和物件期類date,該類物件存放一個日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及設計日期值。
【分析】這個程式需要先定義一個類型別,這個類的資料成員有year,month,day,並且將其設計為private訪問許可權。還需要有5個成員函式,分別為:

void getdate();          //取日期值,格式為“year-month-day”
int getyear();          //取年份
int getmonth();         //取月份
int getday();          //取日期
void setdate(int y,int m,int d);    //設定日期值
程式程式碼如下:
#include <iostream>
using namespace std;
class date
{
public:
 void getdate();
 int getyear();
 int getmonth();
 int getday();
 void setdate(int y,int m,int d);
private:
 int year,month,day;
};
int date::getyear(){ return year; }
int date::getmonth(){ return month; }
int date::getday(){ return day; }
void date::getdate()
{ cout<<"today is:"<<year<<"-"<<month<<"-"<<day<<endl; }
void date::setdate(int y,int m,int d)
{ year=y; month=m; day=d;  }
int main()
{
 date d;
 d.setdate(2011,2,1);
 cout<<"year="<<d.getyear()<<endl;
 cout<<"month="<<d.getmonth()<<endl;
 cout<<"day="<<d.getday()<<endl;
 d.getdate();
 return 0;
}

【總結】這是一個最簡單的類程式,但其中也存在不少問題。比如,如果沒有setdate()函式,就無法對物件賦初值,而且必須按照特定的格式對物件進行設定初值。這個問題就應該採用建構函式來進行物件初始化。
【2-2】對例【2-1】進行改進,要求使用建構函式進行物件初始化,並且格式要不一致。
【分析】這個例子需要使用建構函式,並且要用到建構函式過載,使用預設引數值的建構函式和拷貝建構函式。
程式程式碼如下:

#include <iostream>
using namespace std;
class date
{
public:
 date(int y=0,int m=0,int d=0)
 { year=y; month=m; day=d; }
 date(date &d)
 { year=d.year; month=d.month; day=d.day; }
 void getdate()
 { cout<<"today is:"<<year<<"-"<<month<<"-"<<day<<endl; }
 int getyear() { return year; }
 int getmonth() { return month; }
 int getday() { return day; }
private:
 int year,month,day;
};

int main()
{
 date d1(2011,2,1),d2,d3(d1);
 d1.getdate();
 d2.getdate();
 d3.getdate();
 return 0;
}

【總結】程式中的物件d1有完整的實參表,則呼叫建構函式來進行物件初始化;物件d2沒有實參表,系統同樣自動呼叫建構函式進行物件初始化,只不過形參的值採用預設引數值進行初始化。對於物件d3,則採用拷貝建構函式進行初始化。
【2-3】輸入資料到陣列內求和、最大值、最小值與平均值後輸出,將成員函式定義在類外。
【分析】這個程式時對C語言中所學內容的一個總結,是從面向過程到面向物件的跨越。這個類的資料成員應該包括陣列。成員函式應該有陣列輸入函式、陣列輸出函式、求和函式、最大值函式、最小值函式和求平均值函式。
程式程式碼如下:

#include <iostream>
using namespace std;
#define N 10
class array
{
public:
 void input();
 void output();
 int max();
 int min();
 int sum();
 float average();
private:
 int a[N],maxnumber,minnumber,sumnumber;
 float avenumber;
};
void array::input()
{
 int i=0;
 cout<<"Please input "<<N<<" numbers:"<<endl;
 for(i=0;i<N;i++)
 {
 cout<<"a["<<i<<"]=";
 cin>>a[i];
 }
}
void array::output()
{
 int i=0;
 cout<<"array a is:"<<endl;
 for(i=0;i<N;i++)
 cout<<a[i]<<" ";
 cout<<endl;
}
int array::max()
{
 int i;
 maxnumber=a[0];
 for(i=1;i<N;i++)
 if(maxnumber<a[i])
  maxnumber=a[i];
 return maxnumber;
}
int array::min()
{
 int i;
 minnumber=a[0];
 for(i=1;i<N;i++)
 if(minnumber>a[i])
  minnumber=a[i];
 return minnumber;
}
int array::sum()
{
 int i;
 sumnumber=a[0];
 for(i=1;i<N;i++)
 sumnumber+=a[i];
 return sumnumber;
}
float array::average()
{
 float ave=static_cast<float>(sumnumber/N);
 return ave;
}
int main()
{
 array a;
 a.input();
 a.output();
 cout<<"The max number is "<<a.max()<<endl;
 cout<<"The min number is "<<a.min()<<endl;
 cout<<"The sum number is "<<a.sum()<<endl;
 cout<<"The average number is"<<a.average()<<endl;
  return 0;
}

【總結】從上面的程式可以看出,類array裡面包括對陣列的各種操作,包括求和,求最大值,求最小值以及求平均值等。
【2-4】設計一個表示貓的類,包括貓的顏色、體重、年齡等資料,具有設定貓的顏色,修改和顯示貓的體重、年齡等操作。
【分析】設計貓類的類名為Cat,此類有3個數據成員,顏色用string類表示,可以存放漢字,體重用實數型別表示,年齡用整數型表示,為了保護資料的安全性,3個數據成員全部為私有性。對貓的屬性資料的設定和修改,全部為公有函式。
程式程式碼如下:

#include <iostream>
#include <string>
using namespace std;
class Cat
{
public:
 Cat(string c="red",float w=1,int a=1);
 string get_color();
 float get_weight();
 int get_age();
 void display();
private:
 string color;
 float weight;
 int age;
};
Cat::Cat(string c,float w,int a)
{
 color=c;
 weight=w;
 age=a;
}
string Cat::get_color()
{
 return color;
}
float Cat::get_weight()
{
 return weight;
}
int Cat::get_age()
{
 return age;
}
void Cat::display()
{
 cout<<"The color of this cat is "<<get_color()<<endl;
 cout<<"The weight of this cat is "<<get_weight()<<endl;
 cout<<"The age of this cat is "<<get_age()<<endl;
}
int main()
{
 Cat c1,c2("yellow",1,2);
 cout<<"c1 is:"<<endl;
 c1.display();
 cout<<"c2 is:"<<endl;
 c2.display();
 return 0;
}

【總結】從上面的程式可以看出,建構函式可以用類對物件進行初始化,並且建構函式可以進行過載。

希望本文可以對大家學習c++程式語言有所幫助,也希望大家可以繼續關注!