当我们通过引用传递参数时,是否可以给函数的参数赋予默认值?在C ++中
例如,当我尝试声明如下函数:
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
发布于 2018-04-12 09:58:00
你可以做一个const引用,但不能用于非const的引用。这是因为C ++不允许临时(在这种情况下是默认值)绑定到非const引用。
其中一种方法是将实际实例用作默认实例:
static int AVAL = 1;
void f( int & x = AVAL ) {
// stuff
}
int main() {
f(); // equivalent to f(AVAL);
}
发布于 2018-04-12 10:12:03
你想要使用的是:
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
}
只有一种情况需要使用默认值,这是一个构造函数。从另一个构造函数中调用是不可能的,所以这种技术在这种情况下不起作用。
https://stackoverflow.com/questions/-100003862
复制相似问题