天天看點

C++類定義與實作

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();
           

繼續閱讀