首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C ++中通过引用传递参数时的默认值?

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

Stack Overflow用户
提问于 2018-04-12 00:59:48
回答 2查看 0关注 0票数 0

当我们通过引用传递参数时,是否可以给函数的参数赋予默认值?在C ++中

例如,当我尝试声明如下函数:

代码语言:javascript
复制
virtual const ULONG Write(ULONG &State = 0, bool sequence = true);

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

error C2440: 'default argument' : cannot convert from 'const int' to 'unsigned long &' A reference that is not to 'const' cannot be bound to a non-lvalue

EN

回答 2

Stack Overflow用户

发布于 2018-04-12 09:58:00

你可以做一个const引用,但不能用于非const的引用。这是因为C ++不允许临时(在这种情况下是默认值)绑定到非const引用。

其中一种方法是将实际实例用作默认实例:

代码语言:javascript
复制
static int AVAL = 1;

void f( int & x = AVAL ) {
   // stuff
} 

int main() {
     f();       // equivalent to f(AVAL);
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-12 10:12:03

你想要使用的是:

代码语言:javascript
复制
virtual const ULONG Write(ULONG &State, bool sequence);
inline const ULONG Write()
{
  ULONG state;
  bool sequence = true;
  Write (state, sequence);
}

使用函数重载还有其他好处。首先你可以默认你想要的任何参数:

代码语言:javascript
复制
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...

也可以在派生类中重新定义默认参数给虚函数,这种重载避免了:

代码语言:javascript
复制
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
}

只有一种情况需要使用默认值,这是一个构造函数。从另一个构造函数中调用是不可能的,所以这种技术在这种情况下不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档