C++類定義與實作
一、類的介紹
類是使用者自定義的類型,并且該類型具有一定的行為能力(類中說的描述方法)。通常來說,一個類中包含兩部分的内容,一是該類的屬性,另一部分是它所擁有的方法。比如說“人”這個類,具有姓名,性别,年齡等屬性;此外,人能夠吃飯,睡覺,行走等行為稱為方法。
1.類的聲明:即類的成員函數聲明,以成員函數的方式被稱為公有接口
接口:一個共享的架構,主要由我們寫的方法提供
二、類的定義
class是C++中新增的關鍵字,專門用于定義類。
class 類名
{
public:
//公共的行為或屬性
protected:
//保護的行為或屬性
private:
//私有的行為或屬性
};
在類内部定義函數體
class 類名
{
傳回類型 函數名(形參清單){
函數體
}
};
在類外部定義函數體
class 類名{
傳回類型 函數名(形參清單);
};
傳回類型 類名::函數名(形參清單){
函數體
};
這兩種定義方法看起來沒什麼差別,其實它們還是有差別的,類内部定義的函數,程式在要調用它的時候會把它當成一個内聯函數,内聯函數調用速度更快。但是會占用額外的記憶體空間,每調用一次相當于定義一次。而外部定義的函數,不會被當做内聯函數,類似與遞歸函數等,定義為内聯函數肯定不合理的。是以建議用外部定義函數體。
類的定義一般放在程式檔案開頭,或者放到頭檔案中被程式檔案包含。也可以放在局部作用域中。在C++規定中,在局部作用域中聲明類,成員函數必須是函數定義形式,不能原型聲明。
類相當于一種新資料類型,資料類型不占用存儲空間,用類定義實體時候,才會為它配置設定空間。
說明:
①類名 需要遵循一般的命名規則;
②類定義結束的分号不能省略;
③public、protected和private為屬性、方法限制的關鍵字,private表示該部分内容是simi私密,不能被外部所通路或調用,隻能被類内部方法進行通路,protected表示受保護成員,可以被繼承,并被派生類對象進行通路。不能被(類外)通路;public表示公開的屬性和方法,外界可以直接通路或者直接調用。
類隻是一個模闆(Template),編譯後不占用記憶體空間,是以在定義類時不能對成員變量進行初始化,因為沒有地方存儲資料。隻有在建立對象以後才會給成員變量配置設定記憶體,這個時候就可以指派了。
class People{
private:
char *name;
int age;
char *sex;
public:
void Print(){
cout<<"姓名"<<name<<"性别"<<sex<<"年齡"<<age;
}
};
三、類的實作
在上面的定義示例中我們隻是定義了這個類的一些屬性和方法聲明, 并沒有去實作它, 類的實作就是完成其方法的過程。類的實作有兩種方式, 一種是在類定義時完成對成員函數的定義, 另一種是在類定義的外部進行完成。
1.類定義是定義成員函數
#include <iostream>
using namespace std;
class Point{
public:
void setPoint(int x,int y) //實作setPoint函數
{
xPos=x;
yPos=y;
}
void printPoint(){ //實作printPoint函數
cout<<"x="<<xPos<<endl;
cout<<"y="<<yPos<<endl;
}
private:
int xPos;
int yPos;
}
int main(){
Point M; //用定義好的類建立一個對象 點M
M.setPoint(10,20); //設定M點的x,y值
M.printPoint(); //輸出M點的資訊
return 0;
}
x=10
y=20
與類的定義相比,在類内實作成員函數不再是在類内進行聲明,而是直接将函數直接定義,在類中定義成員函數時,編譯器預設将其定義為inline函數
2.在類外定義成員函數
在類外定義成員函數通過在類内進行聲明, 然後在類外通過作用域操作符 :: 進行實作
傳回類型 類名::成員函數名(參數清單)
{
//函數體
}
#include <iostream>
using namespace std;
class Point
{
public:
void setPoint(int x, int y); //在類内對成員函數進行聲明
void printPoint();
private:
int xPos;
int yPos;
};
void Point::setPoint(int x, int y) //通過作用域操作符 '::' 實作setPoint函數
{
xPos = x;
yPos = y;
}
void Point::printPoint() //實作printPoint函數
{
cout<< "x = " << xPos << endl;
cout<< "y = " << yPos << endl;
}
int main()
{
Point M; //用定義好的類建立一個對象 點M
M.setPoint(10, 20); //設定 M點 的x,y值
M.printPoint(); //輸出 M點 的資訊
return 0;
}
setPoint 成員函數來說, 在類内聲明的形式為 void setPoint(int x, int y); 那麼在類外對其定義時函數頭就應該是 void Point::setPoint(int x, int y) 這種形式, 其傳回類型、成員函數名、參數清單都要與類内聲明的形式一緻。、
我們之前說過,定義類型時不會配置設定存儲空間,當定義一個對象的時候,将為其配置設定存儲空間。
當然,有時候人們也希望可以動态的為其配置設定記憶體,當不用的時候再銷毀它,就有了如下定義方式:
Point *p;
p=new Point;
當不再使用此動态對象的時候,必須用delete:
delete p;
通路對象中的成員有三種方法:
通過對象名和對象成員引用運算符 (.)
通過指向對象的指針和指針成員引用運算符 (->)
通過對象的引用變量和對象成員引用運算符 (.)
Point P;
P.printPoint();
Point *p;
p=new Point;
p->printPoint();
Point p;
&P=p;
P.printPoint();