C++ 類的私有成員(private)不可被外部直接訪問,需通過公有接口間接操作。以下是四種常見模式。
最標準、封裝性最好的方式。
class Test {
int x, y;
public:
void setX(int a) { x = a; }
void setY(int b) { y = b; }
int getX() const { return x; }
int getY() const { return y; }
void print() const { cout << "x=" << x << ", y=" << y << endl; }
};
int main() {
Test t;
t.setX(1); t.setY(9);
cout << "x=" << t.getX() << ", y=" << t.getY() << endl;
t.print();
}
通過傳入指針讓成員函數寫入值。
class Test {
int x, y;
public:
void setX(int a) { x = a; }
void setY(int b) { y = b; }
void getXY(int* px, int* py) { *px = x; *py = y; }
};
int main() {
Test t; t.setX(1); t.setY(9);
int a, b; t.getXY(&a, &b);
cout << "x=" << a << ", y=" << b << endl;
}
直接返回私有成員值(適用於基本類型)。
class Test {
int x, y;
public:
void setX(int a) { x = a; }
void setY(int b) { y = b; }
int getX() const { return x; }
int getY() const { return y; }
};
int main() {
Test t; t.setX(1); t.setY(9);
int a = t.getX(), b = t.getY();
cout << "x=" << a << ", y=" << b << endl;
}
用引用代替指針,語法更簡潔。
class Test {
int x, y;
public:
void setX(int a) { x = a; }
void setY(int b) { y = b; }
void getXY(int& rx, int& ry) { rx = x; ry = y; }
};
int main() {
Test t; t.setX(1); t.setY(9);
int a, b; t.getXY(a, b);
cout << "x=" << a << ", y=" << b << endl;
}
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| setter/getter | 封裝性強,可加驗證邏輯 | 略顯繁瑣 | 通用首選 |
| 指針參數 | 可一次取多值,兼容 C 風格 | 需檢查空指針 | 需批量輸出、或接口固定為指針 |
| 返回值 | 語法簡單直觀 | 只能返回單值,大對象拷貝開銷 | 基本類型、輕量對象 |
| 引用參數 | 無拷貝、語法乾淨 | 需保證引用有效 | 現代 C++ 首選輸出參數方式 |
所有方法本質都是「提供公有成員函數作為受控訪問通道」。現代 C++ 推薦優先使用 const getter 返回值(得益於 RVO/移動語義)或 引用參數輸出多值。避免直接暴露私有成員或使用 friend 破壞封裝。