3 回答
TA贡献1856条经验 获得超5个赞
您可以为const引用执行此操作,但不能为非const引用执行此操作。这是因为C ++不允许将临时(在这种情况下为默认值)绑定到非const引用。
一种解决方法是使用实际实例作为默认实例:
static int AVAL = 1;
void f( int & x = AVAL ) {
// stuff
}
int main() {
f(); // equivalent to f(AVAL);
}
但这在实际应用中非常有限。
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
}
只有一种情况是真正需要使用默认值,那就是构造函数。不可能从另一个构造函数中调用一个构造函数,因此该技术在这种情况下不起作用。
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);
- 3 回答
- 0 关注
- 1510 浏览
添加回答
举报