C++ 学习-04 重载运算符

文章目录

  • C++ 中的运算符重载
  • 可重载运算符/不可重载运算符
  • 运算符重载实例
    • 一元运算符重载
    • 二元运算符重载
    • 关系运算符重载
    • 输入/输出运算符重载
    • ++ 和 -- 运算符重载
    • 赋值运算符重载
    • 函数调用运算符 () 重载
    • 下标运算符 [] 重载
    • 类成员访问运算符 -> 重载

C++ 中的运算符重载

  1. 可以重定义或重载大部分 C++ 内置的运算符。这样就能使用自定义类型的运算符。

  2. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

可重载运算符/不可重载运算符

  1. 下面是可重载的运算符列表:
    C++ 学习-04 重载运算符_第1张图片
  2. 下面是不可重载的运算符列表:
    C++ 学习-04 重载运算符_第2张图片

运算符重载实例

一元运算符重载

一元运算符只对一个操作数进行操作,下面是一元运算符的实例:

  • 递增运算符( ++ )和递减运算符( – )

  • 一元减运算符,即负号( - )

  • 逻辑非运算符( ! )
    一元运算符通常出现在它们所操作的对象的左边,比如 !obj、-obj 和 ++obj,但有时它们也可以作为后缀,比如 obj++ 或 obj–。

      #include 
      using namespace std;
       
      class Distance
      {
         private:
            int feet;             // 0 到无穷
            int inches;           // 0 到 12
         public:
            // 所需的构造函数
            Distance(){
               feet = 0;
               inches = 0;
            }
            Distance(int f, int i){
               feet = f;
               inches = i;
            }
            // 显示距离的方法
            void displayDistance()
            {
               cout << "F: " << feet << " I:" << inches <

当上面的代码被编译和执行时,它会产生下列结果:

F: -11 I:-10
F: 5 I:-11

二元运算符重载

二元运算符需要两个参数,下面是二元运算符的实例。我们平常使用的加运算符( + )、减运算符( - )、乘运算符( * )和除运算符( / )都属于二元运算符。就像加(+)运算符。

#include 
using namespace std;
 
class Box
{
   double length;      // 长度
   double breadth;     // 宽度
   double height;      // 高度
public:
 
   double getVolume(void)
   {
      return length * breadth * height;
   }
   void setLength( double len )
   {
       length = len;
   }
 
   void setBreadth( double bre )
   {
       breadth = bre;
   }
 
   void setHeight( double hei )
   {
       height = hei;
   }
   // 重载 + 运算符,用于把两个 Box 对象相加
   Box operator+(const Box& b)
   {
      Box box;
      box.length = this->length + b.length;
      box.breadth = this->breadth + b.breadth;
      box.height = this->height + b.height;
      return box;
   }
};
// 程序的主函数
int main( )
{
   Box Box1;                // 声明 Box1,类型为 Box
   Box Box2;                // 声明 Box2,类型为 Box
   Box Box3;                // 声明 Box3,类型为 Box
   double volume = 0.0;     // 把体积存储在该变量中
 
   // Box1 详述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);
 
   // Box2 详述
   Box2.setLength(12.0); 
   Box2.setBreadth(13.0); 
   Box2.setHeight(10.0);
 
   // Box1 的体积
   volume = Box1.getVolume();
   cout << "Volume of Box1 : " << volume <

当上面的代码被编译和执行时,它会产生下列结果:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

关系运算符重载

C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),它们可用于比较 C++ 内置的数据类型。
可以重载任何一个关系运算符,重载后的关系运算符可用于比较类的对象。

#include 
using namespace std;
 
class Distance
{
   private:
      int feet;             // 0 到无穷
      int inches;           // 0 到 12
   public:
      // 所需的构造函数
      Distance(){
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      // 显示距离的方法
      void displayDistance()
      {
         cout << "F: " << feet << " I:" << inches <

当上面的代码被编译和执行时,它会产生下列结果:

D2 is less than D1

输入/输出运算符重载

C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型。您可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。

在这里,有一点很重要,我们需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数。

include 
using namespace std;
 
class Distance
{
   private:
      int feet;             // 0 到无穷
      int inches;           // 0 到 12
   public:
      // 所需的构造函数
      Distance(){
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      friend ostream &operator<<( ostream &output, 
                                       const Distance &D )
      { 
         output << "F : " << D.feet << " I : " << D.inches;
         return output;            
      }
 
      friend istream &operator>>( istream  &input, Distance &D )
      { 
         input >> D.feet >> D.inches;
         return input;            
      }
};
int main()
{
   Distance D1(11, 10), D2(5, 11), D3;
 
   cout << "Enter the value of object : " << endl;
   cin >> D3;
   cout << "First Distance : " << D1 << endl;
   cout << "Second Distance :" << D2 << endl;
   cout << "Third Distance :" << D3 << endl;
 
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

$./a.out
Enter the value of object :
70
10
First Distance : F : 11 I : 10
Second Distance :F : 5 I : 11
Third Distance :F : 70 I : 10

++ 和 – 运算符重载

https://www.runoob.com/cplusplus/increment-decrement-operators-overloading.html

赋值运算符重载

https://www.runoob.com/cplusplus/assignment-operators-overloading.html

函数调用运算符 () 重载

https://www.runoob.com/cplusplus/function-call-operator-overloading.html

下标运算符 [] 重载

https://www.runoob.com/cplusplus/subscripting-operator-overloading.html

类成员访问运算符 -> 重载

https://www.runoob.com/cplusplus/class-member-access-operator-overloading.html

你可能感兴趣的:(C++)