類的封裝性要求:數據成員私有化,操作介面公有化。通過 `private` 隱藏內部實現細節,通過 `public` 成員函數提供受控訪問,實現數據抽象與信息隱藏。
class Person {
private:
char name[5];
int age;
char sex;
public:
void Register(const char* _name, int _age, char _sex) {
strncpy(name, _name, 4); name[4] = '\0'; // 防溢出
age = _age; sex = _sex;
}
void ShowMe() const { // const 成員函數:不修改對象狀態
cout << name << ' ' << age << ' ' << sex << endl;
}
};
int main() {
Person p1, p2;
p2.Register("Zhang3", 19, 'm'); // 直接初始化
char name[5]; int age; char sex;
cin >> name >> age >> sex;
p1.Register(name, age, sex); // 輸入初始化
p1.ShowMe(); p2.ShowMe();
return 0;
}
class Dog {
private:
char name[20]; int age; char sex; float weight;
public:
void setdata(const char* n, int a, char s, float w) {
strncpy(name, n, 19); name[19] = '\0';
age = a; sex = s; weight = w;
}
void GetName() const { cout << "Its name is " << name << ".\n"; }
void GetAge() const { cout << "It is " << age << " years old.\n"; }
void GetSex() const {
cout << "It is " << (sex == 'm' ? "male" : "female") << ".\n";
}
void GetWeight() const { cout << "It is " << weight << " kg.\n"; }
};
class Trapezium {
private:
int xul, yul, xur, yur, xdl, ydl, xdr, ydr; // 左上、右上、左下、右下
public:
void initial(int _xul, int _yul, int _xur, int _yur,
int _xdl, int _ydl, int _xdr, int _ydr) {
xul=_xul; yul=_yul; xur=_xur; yur=_yur;
xdl=_xdl; ydl=_ydl; xdr=_xdr; ydr=_ydr;
}
void GetPosition(int& a, int& b, int& c, int& d,
int& e, int& f, int& g, int& h) const {
a=xul; b=yul; c=xur; d=yur; e=xdl; f=ydl; g=xdr; h=ydr;
}
void Area() const {
// 上底 = xur - xul, 下底 = xdr - xdl, 高 = yul - ydl (假設 yul > ydl)
float area = (float)(xur - xul + xdr - xdl) * (yul - ydl) / 2;
cout << area << endl;
}
};
class MyTime {
private:
int h, m, s; // 內部統一用 24 小時制存儲
public:
void SetTime(int _h, int _m, int _s) { h=_h; m=_m; s=_s; }
void print12() const {
int h12 = (h % 12 == 0) ? 12 : h % 12; // 0/12 都顯示 12
bool isPM = (h >= 12);
cout << setw(2) << setfill('0') << h12 << ':'
<< setw(2) << setfill('0') << m << ':'
<< setw(2) << setfill('0') << s << ' '
<< (isPM ? "PM" : "AM") << endl;
}
void print24() const {
cout << setw(2) << setfill('0') << h << ':'
<< setw(2) << setfill('0') << m << ':'
<< setw(2) << setfill('0') << s << endl;
}
};
<iomanip> 的 `setw`/`setfill` 實現零填充
class Weekday {
private:
int today; // 0-6
public:
void SetDay(int d) { today = (d % 7 + 7) % 7; } // 歸一化
void IncDay() { today = (today + 1) % 7; }
void NowDay() const {
static const char* names[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
cout << names[today] << endl;
}
};
int main() {
Weekday w; int d; cin >> d;
w.SetDay(d);
w.NowDay(); w.IncDay(); w.NowDay(); w.IncDay(); w.NowDay();
return 0;
}
| 能力點 | 體現練習 |
|---|---|
| 私有數據 + 公有介面 | 全部 |
| 構造/初始化函數設計 | Person, Dog |
| const 正確性 | Person::ShowMe, Dog::GetXxx |
| 字符串安全處理 | Person, Dog (strncpy) |
| 引用參數作為輸出 | Trapezium::GetPosition |
| 格式化輸出控制 | Dog, MyTime |
| 邊界條件處理 | MyTime (0/12點), Weekday (模7) |
| 靜態數據成員優化 | Weekday::names |
這五個練習系統性覆蓋了 C++ 類設計的核心場景:基礎封裝、存取器模式、幾何計算、時間處理、枚舉循環。掌握「數據私有、介面公有、const 正確、邊界防禦、格式精確」這五大原則,配合現代 C++ 特性(`std::string`、`