为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
莫回无 2019-09-21 15:07:41
当我们通过引用传递参数时,是否可以为函数的参数提供默认值。在C ++中例如,当我尝试声明一个函数时:virtual const ULONG Write(ULONG &State = 0, bool sequence = true);当我这样做时会出现错误:错误C2440:“默认参数”:无法从“ const int”转换为“ unsigned long&”非引用“ const”的引用不能绑定到非左值
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以为const引用执行此操作,但不能为非const引用执行此操作。这是因为C ++不允许将临时(在这种情况下为默认值)绑定到非const引用。


一种解决方法是使用实际实例作为默认实例:


static int AVAL = 1;


void f( int & x = AVAL ) {

   // stuff


int main() {

     f();       // equivalent to f(AVAL);

}

但这在实际应用中非常有限。


查看完整回答
反对 回复 2019-09-21
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

已经在对您的答案的直接评论之一中说过,但只是正式声明。您要使用的是重载:


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 defaulted

void foo (A const &, C const &); // B defaulted

void 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

}

只有一种情况是真正需要使用默认值,那就是构造函数。不可能从另一个构造函数中调用一个构造函数,因此该技术在这种情况下不起作用。


查看完整回答
反对 回复 2019-09-21
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这个小模板将帮助您:


template<typename T> class ByRef {

public:

    ByRef() {

    }


    ByRef(const T value) : mValue(value) {

    }


    operator T&() const {

        return((T&)mValue);

    }


private:

    T mValue;

};

然后,您将能够:


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


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 1510 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信