在c ++中为什么我们在重载函数中将引用参数声明为const?

时间:2014-03-05 14:02:41

标签: c++ function reference const overloading

friend ostream &operator<<(ostream &output, 
                           const Distance &D)
{ 
    output << "F : " << D.feet << " I : " << D.inches;
    return output;            
}

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  1. 安全const我们确保不会意外修改对象。
  2. 速度:引用比传递值快得多。另外const告诉编译器不会修改对象,因此可以进行一些优化。

答案 2 :(得分:1)

恕我直言:通过引用传递比传递副本更有效,而const关键字阻止你改变原始实例......

答案 3 :(得分:1)

  

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

不,在您发布的功能中,由于其他答案中提到的原因,这样做了,但没有要求,即标准并未强制要求参考参数的重载函数应为{ {1}}

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

答案 4 :(得分:1)

在重载函数中将参考参数定义为const不是必须的。只需在运算符的示例中&lt;&lt;函数中没有更改右操作数。这允许将此运算符与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;

如果运算符中的第二个参数&lt;&lt;将被声明为非const引用。

另一个例子

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

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

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

   A a4( a3 );

答案 5 :(得分:1)

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

您希望该功能需要尽可能少的要求。 如果你写苛刻的签名像     ostream&amp; operator&lt;&lt;(ostream&amp; output,Distance&amp; D)

那么你将无法从操作const对象的代码中调用你的操作符:

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

换句话说,尽可能减少对函数参数的要求会使你的函数更通用。