2014年7月17日 星期四

類別簡介

1. 對於簡單的成員函式,您可以將之實作於類別定義中,在類別定義中即實作的函式會自動成為inline函式,例如:
  • Ball.h
#include <string>
using namespace std;

class Ball { 
public: 
    Ball(); 
    Ball(double, const char*); 
    Ball(double, string&); 
 
    // 實作於類別定義中的函式會自動inline
    double radius() {
        return _radius;
    }
 
    string& name() {
        return _name; 
    }
 
    void radius(double radius) {
        _radius = radius;
    } 
 
    void name(const char *name) {
        _name = name;
    }
 
    void name(string& name) {
        _name = name;
    }
 
    double volumn() {
        return (4 / 3 * 3.14159 * _radius * _radius * _radius); 
    }
 
private:
    double _radius; // 半徑 
    string _name; // 名稱 
};

2. 在定義類別時,如果您只是需要使用到某個類別來宣告指標或是參考,但不涉及類別的生成或操作等訊息,則您可以作該類別的前置宣告(Forward declaration),而不用含入該類別的定義,例如:
  • Test.h
class Ball;

class Test { 
public:
    Test();
    Test(Ball*); 
 
    Ball* ball(); 
    void ball(Ball*);

private:
    Ball *_ball; // 名稱 
};


3. 如果您的類別定義有單一參數的建構函式(或除了第一個參數之外,其它參數都有預設值的建構函式),則預設會有自動轉換的作用,例如:

class Ball { 
public: 
    Ball(const char*); 
   ...
};

則您可以使用以下的方式來建構物件並初始化:

Ball ball = "Green ball";

預設的轉換行為是由編譯器施行的,但有時是有危險的,如果您不希望編譯器自作主張,則您可以使用explicit修飾,告訴編譯器不要自作主張:
class Ball { 
public: 
    explicit Ball(const char*); 
   ...
};


4. 在建構函式的初始化設定語法中,您還可以使用成員初始化列表(Member initialization list),例如:
  • SafeArray.cpp
#include "SafeArray.h"

SafeArray::SafeArray(int len) : length(len) {
    _array = new int[length];
}

...略

要被初始化的成員跟在參數列之後,要被設定給成員的引數被放在括號中,如果有多個成員要初始化,則以逗號分隔。

沒有留言:

張貼留言