C++類(lèi)和對(duì)象實(shí)例解析(二)
C++既是面向?qū)ο笠彩敲嫦蜻^(guò)程的語(yǔ)言,在這里就有一個(gè)重要的概念——類(lèi)。
何謂類(lèi)?類(lèi)是對(duì)對(duì)象的一種抽象,舉例來(lái)講:每一個(gè)實(shí)實(shí)在在存在的人就是一個(gè)對(duì)象,人有很多共同的特征(一個(gè)頭,兩條腿,能走,能跑),這具有共同特征的人就成為一個(gè)類(lèi)。類(lèi)是一個(gè)抽象的名詞,每一個(gè)人(即對(duì)象)是這個(gè)類(lèi)的實(shí)例。
對(duì)象間具有的共同特征是對(duì)象的屬性和行為。錄像機(jī)是一個(gè)對(duì)象,它的屬性是生產(chǎn)廠家、牌子、重量、顏色等等,它的行為就是它的功能,如錄像、放像、快進(jìn)、倒退等操作。
C++程序中,需要先定義一個(gè)類(lèi),形如:
Class 類(lèi)名
{
定義變量;
….
定義函數(shù)
}
在類(lèi)體中時(shí)成員列表,包括數(shù)據(jù)和操作數(shù)據(jù)的函數(shù),即數(shù)據(jù)成員、成員函數(shù)。這體現(xiàn)了類(lèi)的封裝性和信息的隱蔽性。
成員函數(shù)一般在類(lèi)體中聲明,在類(lèi)體外定義。
構(gòu)造函數(shù):對(duì)對(duì)象進(jìn)行賦值
析構(gòu)函數(shù):在函數(shù)功能域結(jié)束時(shí),釋放對(duì)象成員的空間。
內(nèi)聯(lián)函數(shù):為了節(jié)省函數(shù)調(diào)用的時(shí)間
完成各種功能函數(shù)…….
定義對(duì)象就需要對(duì)類(lèi)進(jìn)行實(shí)例化。形如:類(lèi)名對(duì)象名
類(lèi)是一個(gè)抽象,它不占任何內(nèi)存,只有當(dāng)其實(shí)例化成為對(duì)象之后,才會(huì)給其分配空間。
計(jì)算機(jī)中就是用對(duì)象來(lái)描述大千世界的事物。對(duì)象之間通過(guò)消息建立聯(lián)系,借助函數(shù)完成各種各樣的功能。
簡(jiǎn)單的說(shuō),這就是對(duì)象和類(lèi)。
下面通過(guò)實(shí)例理解
【2-1】定義一個(gè)日C++類(lèi)和對(duì)象期類(lèi)date,該類(lèi)對(duì)象存放一個(gè)日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及設(shè)計(jì)日期值。
【分析】這個(gè)程序需要先定義一個(gè)類(lèi)類(lèi)型,這個(gè)類(lèi)的數(shù)據(jù)成員有year,month,day,并且將其設(shè)計(jì)為private訪問(wèn)權(quán)限。還需要有5個(gè)成員函數(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é)】這是一個(gè)最簡(jiǎn)單的類(lèi)程序,但其中也存在不少問(wèn)題。比如,如果沒(méi)有setdate()函數(shù),就無(wú)法對(duì)對(duì)象賦初值,而且必須按照特定的格式對(duì)對(duì)象進(jìn)行設(shè)置初值。這個(gè)問(wèn)題就應(yīng)該采用構(gòu)造函數(shù)來(lái)進(jìn)行對(duì)象初始化。
【2-2】對(duì)例【2-1】進(jìn)行改進(jìn),要求使用構(gòu)造函數(shù)進(jìn)行對(duì)象初始化,并且格式要不一致。
【分析】這個(gè)例子需要使用構(gòu)造函數(shù),并且要用到構(gòu)造函數(shù)重載,使用默認(rèn)參數(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é)】程序中的對(duì)象d1有完整的實(shí)參表,則調(diào)用構(gòu)造函數(shù)來(lái)進(jìn)行對(duì)象初始化;對(duì)象d2沒(méi)有實(shí)參表,系統(tǒng)同樣自動(dòng)調(diào)用構(gòu)造函數(shù)進(jìn)行對(duì)象初始化,只不過(guò)形參的值采用默認(rèn)參數(shù)值進(jìn)行初始化。對(duì)于對(duì)象d3,則采用拷貝構(gòu)造函數(shù)進(jìn)行初始化。
【2-3】輸入數(shù)據(jù)到數(shù)組內(nèi)求和、最大值、最小值與平均值后輸出,將成員函數(shù)定義在類(lèi)外。
【分析】這個(gè)程序時(shí)對(duì)C語(yǔ)言中所學(xué)內(nèi)容的一個(gè)總結(jié),是從面向過(guò)程到面向?qū)ο蟮目缭?。這個(gè)類(lèi)的數(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é)】從上面的程序可以看出,類(lèi)array里面包括對(duì)數(shù)組的各種操作,包括求和,求最大值,求最小值以及求平均值等。
【2-4】設(shè)計(jì)一個(gè)表示貓的類(lèi),包括貓的顏色、體重、年齡等數(shù)據(jù),具有設(shè)置貓的顏色,修改和顯示貓的體重、年齡等操作。
【分析】設(shè)計(jì)貓類(lèi)的類(lèi)名為Cat,此類(lèi)有3個(gè)數(shù)據(jù)成員,顏色用string類(lèi)表示,可以存放漢字,體重用實(shí)數(shù)類(lèi)型表示,年齡用整數(shù)型表示,為了保護(hù)數(shù)據(jù)的安全性,3個(gè)數(shù)據(jù)成員全部為私有性。對(duì)貓的屬性數(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ù)可以用類(lèi)對(duì)對(duì)象進(jìn)行初始化,并且構(gòu)造函數(shù)可以進(jìn)行重載。
希望本文可以對(duì)大家學(xué)習(xí)c++編程語(yǔ)言有所幫助,也希望大家可以繼續(xù)關(guān)注!
相關(guān)文章
C++之std::vector刪除元素的幾種方式及區(qū)別說(shuō)明
這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題
這篇文章主要介紹了c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)的使用
本文主要介紹了C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06關(guān)于Qt添加opencv和libtorch庫(kù)的問(wèn)題
這篇文章主要介紹了Qt添加opencv和libtorch庫(kù)的相關(guān)知識(shí),兩種方法一種是通過(guò)手動(dòng)添加,一種是通過(guò)qt creator添加,需要的朋友可以參考下2022-01-01C++中事件機(jī)制的簡(jiǎn)潔實(shí)現(xiàn)及需要放棄的特性
事件模型是被廣泛使用的好東西,但是C++標(biāo)準(zhǔn)庫(kù)里沒(méi)有現(xiàn)成的,現(xiàn)在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先進(jìn)設(shè)施組合出一個(gè)輕便的實(shí)現(xiàn)吧感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02C++使用expected實(shí)現(xiàn)優(yōu)雅的錯(cuò)誤處理
C++ 中提供了很多中方式進(jìn)行錯(cuò)誤處理。無(wú)論是通過(guò)拋異常還是通過(guò)錯(cuò)誤碼,標(biāo)準(zhǔn)庫(kù)都提供相應(yīng)的調(diào)用,今天本文為大家介紹的是使用expected進(jìn)行錯(cuò)誤處理,感興趣的可以了解一下2023-06-06解析C++編程中的選擇結(jié)構(gòu)和switch語(yǔ)句的用法
這篇文章主要介紹了解析C++編程中的選擇結(jié)構(gòu)和switch語(yǔ)句的用法,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++ 賦值構(gòu)造函數(shù)注意點(diǎn)介紹
下面小編就為大家?guī)?lái)一篇C++ 賦值構(gòu)造函數(shù)注意點(diǎn)介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12