天天看點

C++重載運算符C++重載運算符

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(); 
}
           
C++重載運算符C++重載運算符
C++重載運算符C++重載運算符

**

關鍵字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);
}
           

繼續閱讀