【问题标题】:in c++ why we declare reference parameter as const in overloaded function?在 C++ 中,为什么我们在重载函数中将引用参数声明为 const?
【发布时间】:2014-03-05 14:02:40
【问题描述】:
friend ostream &operator<<(ostream &output, 
                           const Distance &D)
{ 
    output << "F : " << D.feet << " I : " << D.inches;
    return output;            
}

【问题讨论】:

    标签: c++ function reference constants overloading


    【解决方案1】:

    因为您不希望将实例写入流的函数修改实例。

    因为 const 引用与非 const 引用不同(除非您使用 MSVC)可以接受临时对象,这很有用。

    【讨论】:

      【解决方案2】:

      恕我直言:通过引用传递比通过复制传递更有效,并且 const 关键字阻止您更改原始实例...

      【讨论】:

      • @black: 抱歉你的速度更快
      【解决方案3】:

      在 C++ 中为什么我们在重载时将引用参数声明为 const 功能?

      不,在您发布的函数中这样做是出于其他答案中提到的原因,但没有要求,即 标准不要求采用引用参数的重载函数应该是 @ 987654321@.

      你在这里混淆了很多东西。重载是一种语言功能,其中具有相同名称的多个函数可以共存,而const 是一个限定符,表示数据不会通过该变量/函数在给定上下文中更改。如果重载函数采用引用参数,他们没有关系说它必须是const。参考变量也是如此;它们只是另一个变量的别名(不同的名称),与 const 或函数重载无关。

      【讨论】:

        【解决方案4】:

        函数签名是调用代码和函数代码之间的契约。

        您希望该功能要求尽可能少。 如果您写要求苛刻的签名,例如 ostream &operator

        那么您将无法从对 const 对象进行操作的代码中调用您的运算符:

        void Foo(const Distance& d) {
          cout << d;  // syntax error
        }
        

        换句话说,对函数参数的要求越少越好。

        【讨论】:

          【解决方案5】:

          在重载函数中将引用参数定义为 const 不是强制性的。只需在您的运算符

          例如

          #include <iostream>
          
          class Distance
          {
          public:
             //...
             friend ostream &operator<<(ostream &output, 
                                        const Distance &D)
             { 
                 output << "F : " << D.feet << " I : " << D.inches;
                 return output;            
             }
          private:
             float feet;
             //...
          };
          
          int main()
          {
             const Distance d1;
          
             std::cout << d1 << std:;endl;
          }
          

          编译器会发出错误解析语句

             std::cout << d1 << std::endl;
          

          如果运算符

          另一个例子

          #include <iostream>
          
          struct A
          {
             A() {}
             A( A & ) { std::cout << "A( A & )" << std::endl; }
             A( const A & ) { std::cout << "A( const A & )" << std::endl; }
          };
          
          int main()
          {
             A a1;
             A a2( a1 );
             const A a3;
             A a4( a3 );
          }
          

          在此示例中,有两个复制构造函数,其中一个将参数定义为非常量引用,另一个将参数定义为常量引用。

          如果没有第二个复制构造函数,那么编译器会发出错误解析语句

             A a4( a3 );
          

          【讨论】:

          • Okkkk... 知道了 知道了... :) 谢谢 :)
          【解决方案6】:
          1. 安全:通过const,我们确保不会意外修改对象。
          2. 速度:引用比按值传递要快得多。另外const 告诉编译器对象不会被修改,因此可以进行一些优化。

          【讨论】:

          • 哦...谢谢。明白了,我还有一个问题,为什么我们在重载函数中返回“通过引用”?
          • 我猜你很困惑。阅读legends2k的答案。您没有义务使用 const/non-const 引用。
          • 我读了他的评论。我清除了 const 概念。实际上,女士问了一个让我困惑的问题……她问了
          • 用一个例子解释插入(>>)和提取(
          猜你喜欢
          • 2019-01-15
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-23
          • 2020-01-14
          相关资源
          最近更新 更多