C ++中结构引用的默认参数

时间:2011-06-09 07:52:58

标签: c++

我想为函数参数赋予一个默认值,该参数是对结构的引用。 我可以提供什么作为默认值?

5 个答案:

答案 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 &'