friend ostream &operator<<(ostream &output,
const Distance &D)
{
output << "F : " << D.feet << " I : " << D.inches;
return output;
}
答案 0 :(得分:1)
因为您不希望将实例写入流的函数来修改实例。
因为const引用与非const引用不同(除非你使用的是MSVC)可以接受一个临时对象,这很有用。
答案 1 :(得分:1)
const
我们确保不会意外修改对象。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
}
换句话说,尽可能减少对函数参数的要求会使你的函数更通用。