- 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*);
...
};
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];
}
...略
要被初始化的成員跟在參數列之後,要被設定給成員的引數被放在括號中,如果有多個成員要初始化,則以逗號分隔。
沒有留言:
張貼留言