第11章 使用類——再談過載:向量類(二)

superbmc發表於2024-04-07

本文章是作者根據史蒂芬·普拉達所著的《C++ Primer Plus》而整理出的讀書筆記,如果您在瀏覽過程中發現了什麼錯誤,煩請告知。另外,此書由淺入深,非常適合有C語言基礎的人學習,感興趣的朋友可以自行閱讀此書籍。

上節我們實現了個向量類,這節我們主要對其中使用的C++技術做些說明。

向量類的說明

使用狀態成員

Vector類儲存了向量的直角座標和極座標。它使用名為mode的成員來控制使用的建構函式、reset()方法和過載的operator<<()函式使用哪種形式,其中列舉RECT表示直角座標模式、POL表示極座標模式。這樣的成員被稱為狀態成員,因為這種成員描述的是物件所處的狀態。

以建構函式為例:

Vector::Vector(double n1, double n2, Mode form)
{
  mode = form;
  if(form == RECT)
  {
    x = n1;
    y = n2;
    set_mag();
    set_ang();
  }
  else if (form == POL)
  {
    mag = n1;
    ang = n2 / Rad_to_deg;
    set_x();
    set_y();
  }
  else{
    cout << "Incorrect 3rd argument to Vector() --";
    cout << "vector set to 0\n";
    x = y = mag = ang = 0.0;
    mode = RECT;
  }
}

如果第三個引數是RECT或省略了,則將輸入解釋為直角座標;如果為POL,則將解釋為極座標。
我們可以在main函式中,使用VECTOR::vector::RECT或者VECTOR::vector::POL來決定輸入引數的含義。列舉型別定義在公有部分,因此可以使用如下的語句來建立物件:

Vector foolery(20.0, 30.0, VECTOR::Vector::POL);

為Vector類過載算數運算子

我們在Vector類中過載了兩次operator-(),那是因為,在C++中,-運算子已經有兩種含義。首先,使用兩個運算元,它是減法運算子。減法運算子是一個二元運算子,因為它有兩個運算元。其次,使用一個運算元時(如-x),它時負號運算子。這種形式被稱為一元運算子。

首先是第一個,減法運算子過載:

Vector Vector::operator-(const Vector& b) const
{
  return Vector(x - b.x, y - b.y);
}

對於直角座標而言,將x、y分量分別相減即可。

再看第二個,負號運算子過載:

Vector Vector::operator-() const
{
  return Vector(-x, -y);
}

它只使用了一個運算元,假設為:

Vector vc(30.0, 40.0);

則取負號後為

(-30.0,-40.0),

函式過載指的是函式名稱相同,特徵標不同(引數列表不同)的函式。operator-()有兩種不同的定義,是因為它們的特徵標不同。需要注意的是,對於只有二元形式的運算子(如除法運算子),只能將其過載為二元運算子。

相關文章