首页 > C/C++ > 侯捷-C++面向对象程序设计-学习笔记-05-操作符重载和临时对象

侯捷-C++面向对象程序设计-学习笔记-05-操作符重载和临时对象

2020年8月12日
分类: C/C++ 标签: ,

1,c++操作符重载

【操作符也即运算符。为什么要重载运算符?这其实是为了保证我们自定义的类型和c++内置的数据类型对使用者来说有着一致的操作性,用户可以像使用内置类型一样使用我们定义的类型;同时也要保证相关操作的正确性,如果不重载,编译器要么明确提示不支持该操作,要么给出的实现和我们预期的不一致】

运算符重载有两种实现方式:

  • 以成员函数的形式重载
    • class Complex{
          public:
              inline Complex& operator +=(const Complex& r)
              {
                  this->re += r.re;
                  this->im += r.im;
                  return *this;
              }
      
          private:
              double re, im;
      };
  • 以全局函数的形式重载
    • class Complex{
          public:
              double& real() {return re;}
              double& imag(){return im;}
          private:
              double re, im;
      };
      
      inline Complex& operator +=(Complex& l, const Complex& r)
      {
              l.real() += r.real();
              l.imag() += r.imag();
              return l;
      }

2,对于返回值类型的考量

  • 要不要返回值?返回对象的值还是返回对象的引用?
    • 【这里其实还是以运算符的使用场景作为设计原则。以输出运算符(<<)为例。】
    • class Complex{
          public:
              Complex(double r, double i):re(r), im(i) {}
              double real() const {return re;}
              double imag() const {return im;}
      
          private:
              double re, im;
      };
      
      inline ostream& operator <<(ostream& os, const Complex& c)
      {
          os << c.real() << "," << c.imag();
          return os;
      }
      
      int main()
      {
          Complex c1(1,2), c2(3,4);
          cout << c1 << endl << c2;
          return 0;
      }
    • 如果仅仅是输出单个对象,就不需要返回值:cout << c1;
    • 如果希望可以连续输出多个对象,输出运算符就得返回一个ostream对象:cout << c1 << c2;
    • 对于返回对象的场景,优先考虑返回非局部对象的引用。

3,临时对象

  • 直接使用typename()形式就创建了一个临时对象:Complex(1,2)

 

————————-笔记分割线——————–

【侯捷老师推荐的书籍】

您可能需要这些【参考资料】:
零一积流|IT参考 原创文章,转载请注明出处: http://www.it-refer.com/2020/08/12/houjie-cplusplus-object-oriented-programming-05-operator-overload-temporary-object


本文的评论功能被关闭了.