我想为函数参数赋予一个默认值,该参数是对结构的引用。 我可以提供什么作为默认值?
答案 0 :(得分:16)
第一个解决方案:
如果它是对结构的引用,那么你必须进行const
引用,并执行以下操作:
struct A
{
//etc
A(int, int);
};
void f(int a, const A & = A(10,20) ) //const is necessary
{
//etc
}
由于显而易见的原因,它不是那么好:它使参数const
(您可能不需要它),并且您的结构需要具有构造函数(您可能没有它)。
第二个解决方案:
因此,如果你不想让它const
,或者如果你不想在结构中有一个构造函数,那么你可以这样做:
struct Point
{
int x, y, z;
};
Point g_default_point = {10,20,30};
void g(int a, Point & p = g_default_point )
{
//etc
}
仍然不好。定义全局变量不是一个好主意。
void g(int a, Point & p)
{
//your code
}
void g(int a) //this function would behave as if you opt for default value!
{
Point default_value = {10,20,30};
g(a, default_value);
}
现在它不需要你创建参数const
,它也不会强迫你在你的结构中有构造函数。
答案 1 :(得分:3)
这适用于C ++ 0x:
#include <iostream>
struct structure { int x, y ; } ;
int f(int a, structure &s = structure{10,20}) {
return s.x + s.y ;
}
int main() {
std::cout << f (99) << std::endl ;
}
请注意,s
不一定是const
。请参阅http://ideone.com/sikjf。
答案 2 :(得分:0)
你做不到。
声明时必须初始化所有引用。引用只是变量的另一个名称。因此,您无法为参数引用其他变量的默认值。
如果必须这样做,可以改用指针。在这种情况下,您可以将0
指定为参数的默认值。
答案 3 :(得分:0)
一个对象(它可以参考),一个现有的引用。如果您的参数恰好是const引用,那么表达式会产生该类型。
举例说明:
struct X
{
X operator+(const X&) const;
};
X x1;
X& x2;
void f(X& x = x1);
void f(X& x = x2);
void f(const X& x = x1 + x1);
答案 4 :(得分:0)
如果传递对象,则可以这样做。
int rowCount(const QModelIndex &parent = QModelIndex()) const;
以这种方式执行:
第一步是评估函数内表达式,其中调用对象构造函数并使用它初始化引用。
第二步是执行函数体,其中对象存在。
第三步是进入下一个功能,第一步创建的对象超出范围,因此他们的析构函数被调用。
即使const也不是必须的,但是大多数编译器都会警告你用临时语句初始化引用。
该解决方案不适用于没有构造函数的类型,int test (int &i=int());
将失败(至少在VisualStudio 2008上它显示为error C2440: 'default argument' : cannot convert from 'int' to 'int &'
)