C++重載運算符
文法:傳回值 operator運算符()
例子:
#include <iostream>
class Drug
{
int Hp;
public:
Drug(int hp):Hp(hp) {}
int GetHp() const
{
return Hp;
}
};
class Role
{
int Hp;
int MaxHp;
public:
Role(int hp,int maxHp):Hp(hp),MaxHp(maxHp) {}
int GetHP() const
{
return Hp;
}
void operator+( Drug drug)
{
Hp += drug.GetHp();
if (Hp > MaxHp)
{
Hp = MaxHp;
}
}
};
int main()
{
Role Player{50,100};
Drug addHp{20};
Player + addHp;
std::cout<< Player.GetHP();
}

**
關鍵字noexcept
**
從C++11開始,我們能看到很多代碼當中都有關鍵字noexcept。比如下面就是std::initializer_list的預設構造函數,其中使用了noexcept。
constexpr initializer_list() noexcept
: _M_array(0), _M_len(0) { }
該關鍵字告訴編譯器,函數中不會發生異常,這有利于編譯器對程式做更多的優化。
如果在運作時,noexecpt函數向外抛出了異常(如果函數内部捕捉了異常并完成處理,這種情況不算抛出異常),程式會直接終止,調用std::terminate()函數,該函數内部會調用std::abort()終止程式。
**
C++的異常處理
**
C++中的異常處理是在運作時而不是編譯時檢測的。為了實作運作時檢測,編譯器建立額外的代碼,然而這會妨礙程式優化。
在實踐中,一般兩種異常抛出方式是常用的:
一個操作或者函數可能會抛出一個異常;
一個操作或者函數不可能抛出任何異常。
後面這一種方式中在以往的C++版本中常用throw()表示,在C++ 11中已經被noexcept代替。
void swap(Type& x, Type& y) throw() //C++11之前
{
x.swap(y);
}
void swap(Type& x, Type& y) noexcept //C++11
{
x.swap(y);
}