C++類和對(duì)象實(shí)例解析(二)
C++既是面向?qū)ο笠彩敲嫦蜻^(guò)程的語(yǔ)言,在這里就有一個(gè)重要的概念——類。
何謂類?類是對(duì)對(duì)象的一種抽象,舉例來(lái)講:每一個(gè)實(shí)實(shí)在在存在的人就是一個(gè)對(duì)象,人有很多共同的特征(一個(gè)頭,兩條腿,能走,能跑),這具有共同特征的人就成為一個(gè)類。類是一個(gè)抽象的名詞,每一個(gè)人(即對(duì)象)是這個(gè)類的實(shí)例。
對(duì)象間具有的共同特征是對(duì)象的屬性和行為。錄像機(jī)是一個(gè)對(duì)象,它的屬性是生產(chǎn)廠家、牌子、重量、顏色等等,它的行為就是它的功能,如錄像、放像、快進(jìn)、倒退等操作。
C++程序中,需要先定義一個(gè)類,形如:
Class 類名
{
定義變量;
….
定義函數(shù)
}
在類體中時(shí)成員列表,包括數(shù)據(jù)和操作數(shù)據(jù)的函數(shù),即數(shù)據(jù)成員、成員函數(shù)。這體現(xiàn)了類的封裝性和信息的隱蔽性。
成員函數(shù)一般在類體中聲明,在類體外定義。
構(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ì)類進(jìn)行實(shí)例化。形如:類名對(duì)象名

類是一個(gè)抽象,它不占任何內(nèi)存,只有當(dāng)其實(shí)例化成為對(duì)象之后,才會(huì)給其分配空間。
計(jì)算機(jī)中就是用對(duì)象來(lái)描述大千世界的事物。對(duì)象之間通過(guò)消息建立聯(lián)系,借助函數(shù)完成各種各樣的功能。
簡(jiǎn)單的說(shuō),這就是對(duì)象和類。
下面通過(guò)實(shí)例理解
【2-1】定義一個(gè)日C++類和對(duì)象期類date,該類對(duì)象存放一個(gè)日期,可以提供的操作有:取日期值,取年份,提取月份,提取日期以及設(shè)計(jì)日期值。
【分析】這個(gè)程序需要先定義一個(gè)類類型,這個(gè)類的數(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)單的類程序,但其中也存在不少問(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ù)定義在類外。
【分析】這個(gè)程序時(shí)對(duì)C語(yǔ)言中所學(xué)內(nèi)容的一個(gè)總結(jié),是從面向過(guò)程到面向?qū)ο蟮目缭?。這個(gè)類的數(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里面包括對(duì)數(shù)組的各種操作,包括求和,求最大值,求最小值以及求平均值等。
【2-4】設(shè)計(jì)一個(gè)表示貓的類,包括貓的顏色、體重、年齡等數(shù)據(jù),具有設(shè)置貓的顏色,修改和顯示貓的體重、年齡等操作。
【分析】設(shè)計(jì)貓類的類名為Cat,此類有3個(gè)數(shù)據(jù)成員,顏色用string類表示,可以存放漢字,體重用實(shí)數(shù)類型表示,年齡用整數(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ù)可以用類對(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-08
c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題
這篇文章主要介紹了c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11
C++編程語(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-01
C++中事件機(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-02
C++使用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-09
C++ 賦值構(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

