傳統C++回顧

真真夜夜發表於2024-05-09

主要參考菜鳥教程,用於回憶當時沒有好好學習的C++98

Vector的學習

#include <iostream>
#include <vector>
using namespace std;

int main() {
  vector<int> myVector;

  myVector.push_back(3);
  myVector.push_back(7);
  myVector.push_back(11);
  myVector.push_back(5);

  cout << "Elements in the vector: ";
  for (int element : myVector) {
    cout << element << " ";
  }
  cout << endl;

  cout << "First Element: " << myVector[0] << endl;
  cout << "Second Element: " << myVector.at(1) << endl;
  cout << "Size of vector: " << myVector.size() << endl;

  myVector.erase(myVector.begin() + 2);

  cout << "Elements in the vector after erasing: ";
  for (int element : myVector) {
    cout << element << " ";
  }
  cout << endl;

  myVector.clear();
  cout << "Size of the vector after clearing: " << myVector.size() << endl;
  return 0;
}

C++物件導向

  1. 類訪問修飾符
  • public: 可以被外部訪問
  • private: 只能在類內部訪問
  • protected: 可以被子類訪問
  1. 類建構函式 & 解構函式
  • 建構函式,作用是初始化物件
    • 預設建構函式 Line()
    • 帶引數的建構函式 Line(double len)
    • 初始化列表 Line::Line( double len): length(len)
  • 解構函式,作用是釋放物件
    • Line::~Line()
  1. 複製建構函式
  • 它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件
    • 透過使用另一個同型別的物件來初始化新建立的物件
    • 複製物件把它作為引數傳遞給函式
    • 複製物件,並從函式返回這個物件
      如果在類中沒有定義複製建構函式,編譯器會自行定義一個。如果類帶有指標變數,並有動態記憶體分配,則它必須有一個複製建構函式。

複製建構函式確保了在建立物件副本時正確地複製了動態分配的記憶體,並保持了原始物件和新物件之間的獨立性。但這會帶來效能上的損失,尤其是在處理大型物件或包含複雜資源(如動態分配記憶體、檔案控制代碼、網路連線等)的物件時。每次複製建構函式被呼叫時,都會執行一次物件的複製操作,這可能會涉及昂貴的資源分配和複製過程。

為了減少效能損失,可以採取以下措施:

  • 使用引用傳遞:在函式引數中使用引用或常量引用來避免不必要的複製。
  • 移動語義:C++11引入了右值引用和移動建構函式,可以更高效地處理臨時物件的複製,透過“偷走”資源而不是複製它們。
  • 最佳化複製建構函式:如果可能,最佳化複製建構函式的實現,避免不必要的複製操作。
  • 使用智慧指標:例如,使用std::unique_ptr或std::shared_ptr來自動管理資源,這樣可以減少手動記憶體管理的需要,並且可以更高效地處理物件的複製。