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);
}