十六、類的真正形態

小胖鼠發表於2019-05-11

1、類的關鍵字

  • struct在C語言中已經有了自己的含義,必須繼續相容
  • 在C++中提供了新的關鍵字 class用於類定義
  • cass和 struct的用法是完全相同的

在用struct定義類時,所有成員的預設訪問級別為public

在用class定義類時,所有成員的預設訪問級別為private

#include <stdio.h>

struct A
{
    // defualt to public
    int i;
    // defualt to public
    int getI()
    {
        return i;
    }
};

class B
{
    // defualt to private
    int i;
    // defualt to private
    int getI()
    {
        return i;
    }
};

int main()
{
    A a;
    B b;
    
    a.i = 4;
    
    printf("a.getI() = %d
", a.getI());
    
    b.i = 4;
    
    printf("b.getI() = %d
", b.getI());
    
    return 0;
}

2、小例項

需求:開發一個用於四則運算的類

  • 提供 setoperator函式設定運算型別
  • 提供 setParameter函式設定運算引數
  • 提供 result函式進行運算

    • 其返回值表示運算的合法性
    • 通過引用引數返回結果
// Operator.h
#ifndef _OPERATOR_H_
#define _OPERATOR_H_

class Operator
{
private:
    char mOp;
    double mP1;
    double mP2;
    
public:
    bool setOperator(char op);
    void setParameter(double p1, double p2);
    bool result(double& r);
};

#endif

//Operator.c 
#include "Operator.h"
bool Operator::setOperator(char op)
{
    bool ret = false;
        
    if( (op == `+`) || (op == `-`) || (op == `*`) || (op == `/`) )
    {
        ret = true;
        mOp = op;
    }
    else
    {
        mOp = ` `;
    }
        
    return ret;
}

void Operator::setParameter(double p1, double p2)
{
    mP1 = p1;
    mP2 = p2;
}
    
bool Operator::result(double& r)
{
    bool ret = true;
        
    switch( mOp )
    {
        case `/`:
            if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
            {
                ret = false;
            }
            else
            {
                r = mP1 / mP2;
            }
            break;
        case `+`:
            r = mP1 + mP2;
            break;
        case `*`:
            r = mP1 * mP2;
            break;
        case `-`:
            r = mP1 - mP2;
            break;
        default:
            ret = false;
            break;
    }
        
    return ret;
}

3、類的真正形態

  • C++中的類支援宣告和實現的分離
  • 將類的實現和定義分開

    • .h標頭檔案中只有類的宣告

      • 成員變數和成員函式的宣告
    • .cpp原始檔中完成類的其它實現

      • 成員函式的具體實現

4、小結

C++引進了新的關鍵字class用於定義類

structclass的區別在於預設訪問級別的不同

C++中的類支援宣告和實現的分離

  • 在標頭檔案中宣告類
  • 在原始檔中實現類

相關文章