在C ++中通过引用传递时参数的默认值

当我们通过引用传递参数时,是否可以为函数的参数提供默认值。在C ++中


例如,当我尝试声明一个函数时:


virtual const ULONG Write(ULONG &State = 0, bool sequence = true);

当我这样做时会出现错误:


错误C2440:“默认参数”:无法从“ const int”转换为“ unsigned long&”非引用“ const”的引用不能绑定到非左值


莫回无
浏览 1511回答 3
3回答

RISEBY

您可以为const引用执行此操作,但不能为非const引用执行此操作。这是因为C ++不允许将临时(在这种情况下为默认值)绑定到非const引用。一种解决方法是使用实际实例作为默认实例:static int AVAL = 1;void f( int & x = AVAL ) {   // stuff} int main() {     f();       // equivalent to f(AVAL);}但这在实际应用中非常有限。

小唯快跑啊

已经在对您的答案的直接评论之一中说过,但只是正式声明。您要使用的是重载:virtual const ULONG Write(ULONG &State, bool sequence);inline const ULONG Write(){  ULONG state;  bool sequence = true;  Write (state, sequence);}使用函数重载也有其他好处。首先,您可以默认使用任何您想要的参数:class A {}; class B {}; class C {};void foo (A const &, B const &, C const &);void foo (B const &, C const &); // A defaultedvoid foo (A const &, C const &); // B defaultedvoid foo (C const &); // A & B defaulted etc...也可以将默认参数重新定义为派生类中的虚函数,这样可以避免重载:class Base {public:  virtual void f1 (int i = 0);  // default '0'  virtual void f2 (int);  inline void f2 () {    f2(0);                      // equivalent to default of '0'  }};class Derived : public Base{public:  virtual void f1 (int i = 10);  // default '10'  using Base::f2;  virtual void f2 (int);};void bar (){  Derived d;  Base & b (d);  d.f1 ();   // '10' used  b.f1 ();   // '0' used  d.f2 ();   // f1(int) called with '0'   b.f2 ();   // f1(int) called with '0}只有一种情况是真正需要使用默认值,那就是构造函数。不可能从另一个构造函数中调用一个构造函数,因此该技术在这种情况下不起作用。

胡子哥哥

这个小模板将帮助您:template<typename T> class ByRef {public:&nbsp; &nbsp; ByRef() {&nbsp; &nbsp; }&nbsp; &nbsp; ByRef(const T value) : mValue(value) {&nbsp; &nbsp; }&nbsp; &nbsp; operator T&() const {&nbsp; &nbsp; &nbsp; &nbsp; return((T&)mValue);&nbsp; &nbsp; }private:&nbsp; &nbsp; T mValue;};然后,您将能够:virtual const ULONG Write(ULONG &State = ByRef<ULONG>(0), bool sequence = true);
打开App,查看更多内容
随时随地看视频慕课网APP