# 從 DSA 作業看 C++ 課程不一定會教你的那些事

## 之所以要學高階程式語言，其中一個原因是我們不希望它只要「能動就好」。

1. 矩陣數值的型態均為 double，所需的儲存空間為建立物件時動態配置。
2. 實作建構子 (constructor)：以行列為參數建構物件，並須實作複製與指定等操作。
3. 實作解構子 (destructor)：物件被消滅時正確地回收動態配置的記憶體。
4. 實作運算子重載 (overload)：一元運算(正、負)、二元運算 (加減乘除)、 `[]` 運算子。
5. 實作 I/O 方法和一個 `inverse()` 來取得方陣的反矩陣，spec 上說，呼叫前保證反矩陣一定存在。

### Constructor

(請原諒 Medium 沒有 code highlighting，合先敘明。)

`Matrix::Matrix(const int& r, const int& c) : row(r), col(c) {  array = new double*[r];  for (int i = 0; i < r; i++) {    array[i] = new double[c]();  // initialized to 0  }}`

`/* ref. impl. */Matrix::Matrix(const Matrix& rhs) : row(rhs.row), col(rhs.col) {  array = new double*[r];  for (int i = 0; i < row; i++) {    array[i] = new double[c]();  }  // ... wait a minute!}`

C++11 有個新的語法是「委派建構子 (delegating constructor)」，能夠在時大幅簡化建構子的重複部份：

[…] If the name of the class itself appears as `class-or-identifier` in the member initializer list, then the list must consist of that one member initializer only; such constructor is known as the delegating constructor, and the constructor selected by the only member of the initializer list is the target constructor.
(
cppreference.com)

`Matrix::Matrix(const Matrix& rhs) : Matrix(rhs.row, rhs.col) {  for (int i = 0; i < r; i++)    for (int j = 0; j < c; j++)      array[i][j] = rhs.array[i][j];}`

### Assignment Operator

`/* ref. impl. */Matrix Matrix::operator =(const Matrix& rhs) {  row = rhs.row;  col = rhs.col;  array = new double*[row];  /* ... tedious job here ... */  return *this;}`

… 但你其實可以這麼做 (copy-and-swap idiom)：

`Matrix Matrix::operator =(const Matrix& rhs) {  Matrix ret(rhs);  // copy  std::swap(this->row, ret.row);  std::swap(this->col, ret.col);  std::swap(this->array, ret.array);  return *this;}`
The copy-and-swap idiom is a way to do just that: It first calls a class’ copy constructor to create a temporary, then swaps its data with the temporary’s, and then lets the temporary’s destructor destroy the old state. (StackOverflow)

### 觀念澄清：C 早已不是 C++ 的子集

C++ 最早的確是基於 C 語言的語法誕生的，但至少在 C89 (筆者出生之前) 以後就不是了，就算不考慮語法層次，語義和實作規範上也大大不同。網路上可以查到很多資料像是這篇。考量到進入資工系的時候第一個學習的語言是 C，或在這之前寫了很多 C 和 C++ 隨意混用的程式碼片段，如果時間許可，想精進自己撰寫 C++ 程式的技巧，我會建議寫之前多查查文件，區分兩者在語言風格上的差異。畢竟，寫程式通常只需要寫一遍，但它將會被無數的人閱讀好幾遍，如果你寫的 C++ 只是包著 STL 和各種 template 的 C，那讀程式碼會是一件非常痛苦的事 …

… 你還不如當個慣 C 就好 (逃跑)