有三种不同的方法可以重载运算符:成员函数方法,朋友函数方法和普通函数方法。
通常,如果有可能使用现有的成员函数,则应优先选择普通函数而不是好友函数(接触类内部的函数越少越好)。但是,不要添加其他访问函数只是为了使运算符重载为普通功能,而不是朋友功能!
规则:如果可能的话,在不增加其他功能的情况下,最好将重载运算符作为普通函数而非好友。
对于重载运算符,没有太多语法和语言逻辑,知道怎么做,有个模板代码,以后借鉴去改。
9.2 重载算数运算符,+
-
等
使用friend
函数进行重载
对这个美分的类进行+运算。
class Cents
{
private:
int m_cents;
public:
Cents(int cents) { m_cents = cents; }
int getCents() const { return m_cents; }
};
重载定义如下:
#include <iostream>
class Cents
{
private:
int m_cents;
public:
Cents(int cents) { m_cents = cents; }
// add Cents + Cents using a friend function
friend Cents operator+(const Cents &c1, const Cents &c2);
int getCents() const { return m_cents; }
};
// note: this function is not a member function!
Cents operator+(const Cents &c1, const Cents &c2)
{
// use the Cents constructor and operator+(int, int)
// we can access m_cents directly because this is a friend function
return Cents(c1.m_cents + c2.m_cents);
}
int main()
{
Cents cents1(6);
Cents cents2(8);
Cents centsSum = cents1 + cents2;
std::cout << "I have " << centsSum.getCents() << " cents." << std::endl;
return 0;
}
使用普通函数重载
#include <iostream>
class Cents
{
private:
int m_cents;
public:
Cents(int cents) { m_cents = cents; }
int getCents() const { return m_cents; }
};
// note: this function is not a member function nor a friend function!
Cents operator+(const Cents &c1, const Cents &c2)
{
// use the Cents constructor and operator+(int, int)
// we don't need direct access to private members here
return Cents(c1.getCents() + c2.getCents());
}
int main()
{
Cents cents1(6);
Cents cents2(8);
Cents centsSum = cents1 + cents2;
std::cout << "I have " << centsSum.getCents() << " cents." << std::endl;
return 0;
}
9.6比较运算符:==
!=
<
>
这是一段比较==
和!=
运算符的代码。
#include <iostream>
#include <string>
class Car
{
private:
std::string m_make;
std::string m_model;
public:
Car(std::string make, std::string model)
: m_make{ make }, m_model{ model }
{
}
friend bool operator== (const Car &c1, const Car &c2);
friend bool operator!= (const Car &c1, const Car &c2);
};
bool operator== (const Car &c1, const Car &c2)
{
return (c1.m_make== c2.m_make &&
c1.m_model== c2.m_model);
}
bool operator!= (const Car &c1, const Car &c2)
{
return !(c1== c2);
}
int main()
{
Car corolla{ "Toyota", "Corolla" };
Car camry{ "Toyota", "Camry" };
if (corolla == camry)
std::cout << "a Corolla and Camry are the same.\n";
if (corolla != camry)
std::cout << "a Corolla and Camry are not the same.\n";
return 0;
}
>
和<
运算符同理。
#include <iostream>
class Cents
{
private:
int m_cents;
public:
Cents(int cents)
: m_cents{ cents }
{}
friend bool operator> (const Cents &c1, const Cents &c2);
friend bool operator<= (const Cents &c1, const Cents &c2);
friend bool operator< (const Cents &c1, const Cents &c2);
friend bool operator>= (const Cents &c1, const Cents &c2);
};
bool operator> (const Cents &c1, const Cents &c2)
{
return c1.m_cents > c2.m_cents;
}
bool operator>= (const Cents &c1, const Cents &c2)
{
return c1.m_cents >= c2.m_cents;
}
bool operator< (const Cents &c1, const Cents &c2)
{
return c1.m_cents < c2.m_cents;
}
bool operator<= (const Cents &c1, const Cents &c2)
{
return c1.m_cents <= c2.m_cents;
}
int main()
{
Cents dime{ 10 };
Cents nickel{ 5 };
if (nickel > dime)
std::cout << "a nickel is greater than a dime.\n";
if (nickel >= dime)
std::cout << "a nickel is greater than or equal to a dime.\n";
if (nickel < dime)
std::cout << "a dime is greater than a nickel.\n";
if (nickel <= dime)
std::cout << "a dime is greater than or equal to a nickel.\n";
return 0;
}
Tips:
对于逻辑相反的两个运算符,定义好第一个,第二个直接对第一个取反就行。