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++程式語言有所幫助,也希望大家可以繼續關注!