C++類和對象實例解析(二)
C++既是面向?qū)ο笠彩敲嫦蜻^程的語言,在這里就有一個重要的概念——類。
何謂類?類是對對象的一種抽象,舉例來講:每一個實實在在存在的人就是一個對象,人有很多共同的特征(一個頭,兩條腿,能走,能跑),這具有共同特征的人就成為一個類。類是一個抽象的名詞,每一個人(即對象)是這個類的實例。
對象間具有的共同特征是對象的屬性和行為。錄像機是一個對象,它的屬性是生產(chǎn)廠家、牌子、重量、顏色等等,它的行為就是它的功能,如錄像、放像、快進、倒退等操作。
C++程序中,需要先定義一個類,形如:
Class 類名
{
定義變量;
….
定義函數(shù)
}
在類體中時成員列表,包括數(shù)據(jù)和操作數(shù)據(jù)的函數(shù),即數(shù)據(jù)成員、成員函數(shù)。這體現(xiàn)了類的封裝性和信息的隱蔽性。
成員函數(shù)一般在類體中聲明,在類體外定義。
構(gòu)造函數(shù):對對象進行賦值
析構(gòu)函數(shù):在函數(shù)功能域結(jié)束時,釋放對象成員的空間。
內(nèi)聯(lián)函數(shù):為了節(jié)省函數(shù)調(diào)用的時間
完成各種功能函數(shù)…….
定義對象就需要對類進行實例化。形如:類名對象名
類是一個抽象,它不占任何內(nèi)存,只有當(dāng)其實例化成為對象之后,才會給其分配空間。
計算機中就是用對象來描述大千世界的事物。對象之間通過消息建立聯(lián)系,借助函數(shù)完成各種各樣的功能。
簡單的說,這就是對象和類。
下面通過實例理解
【2-1】定義一個日C++類和對象期類date,該類對象存放一個日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及設(shè)計日期值。
【分析】這個程序需要先定義一個類類型,這個類的數(shù)據(jù)成員有year,month,day,并且將其設(shè)計為private訪問權(quán)限。還需要有5個成員函數(shù),分別為:
void getdate(); //取日期值,格式為“year-month-day” int getyear(); //取年份 int getmonth(); //取月份 int getday(); //取日期 void setdate(int y,int m,int d); //設(shè)置日期值 程序代碼如下: #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; }
【總結(jié)】這是一個最簡單的類程序,但其中也存在不少問題。比如,如果沒有setdate()函數(shù),就無法對對象賦初值,而且必須按照特定的格式對對象進行設(shè)置初值。這個問題就應(yīng)該采用構(gòu)造函數(shù)來進行對象初始化。
【2-2】對例【2-1】進行改進,要求使用構(gòu)造函數(shù)進行對象初始化,并且格式要不一致。
【分析】這個例子需要使用構(gòu)造函數(shù),并且要用到構(gòu)造函數(shù)重載,使用默認參數(shù)值的構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)。
程序代碼如下:
#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; }
【總結(jié)】程序中的對象d1有完整的實參表,則調(diào)用構(gòu)造函數(shù)來進行對象初始化;對象d2沒有實參表,系統(tǒng)同樣自動調(diào)用構(gòu)造函數(shù)進行對象初始化,只不過形參的值采用默認參數(shù)值進行初始化。對于對象d3,則采用拷貝構(gòu)造函數(shù)進行初始化。
【2-3】輸入數(shù)據(jù)到數(shù)組內(nèi)求和、最大值、最小值與平均值后輸出,將成員函數(shù)定義在類外。
【分析】這個程序時對C語言中所學(xué)內(nèi)容的一個總結(jié),是從面向過程到面向?qū)ο蟮目缭健_@個類的數(shù)據(jù)成員應(yīng)該包括數(shù)組。成員函數(shù)應(yīng)該有數(shù)組輸入函數(shù)、數(shù)組輸出函數(shù)、求和函數(shù)、最大值函數(shù)、最小值函數(shù)和求平均值函數(shù)。
程序代碼如下:
#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; }
【總結(jié)】從上面的程序可以看出,類array里面包括對數(shù)組的各種操作,包括求和,求最大值,求最小值以及求平均值等。
【2-4】設(shè)計一個表示貓的類,包括貓的顏色、體重、年齡等數(shù)據(jù),具有設(shè)置貓的顏色,修改和顯示貓的體重、年齡等操作。
【分析】設(shè)計貓類的類名為Cat,此類有3個數(shù)據(jù)成員,顏色用string類表示,可以存放漢字,體重用實數(shù)類型表示,年齡用整數(shù)型表示,為了保護數(shù)據(jù)的安全性,3個數(shù)據(jù)成員全部為私有性。對貓的屬性數(shù)據(jù)的設(shè)置和修改,全部為公有函數(shù)。
程序代碼如下:
#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; }
【總結(jié)】從上面的程序可以看出,構(gòu)造函數(shù)可以用類對對象進行初始化,并且構(gòu)造函數(shù)可以進行重載。
希望本文可以對大家學(xué)習(xí)c++編程語言有所幫助,也希望大家可以繼續(xù)關(guān)注!
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載