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

Default argument for structure reference in C++

本文关键字:默认 参数 引用 结构 C++      更新时间:2023-10-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,也不强制您在结构中具有构造函数。

这在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.

你不能那样做。

声明时必须初始化所有引用。引用只是变量的另一个名称。所以,不能为引用其他变量的参数指定默认值。

若必须这样做,可以使用指针。在这种情况下,可以将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);

如果传递对象,则可以执行此操作。int rowCount(const QModelIndex &parent = QModelIndex()) const;执行方式如下:

  • 第一步是评估函数内表达式,其中调用对象构造函数并用它初始化引用

  • 第二步是执行对象所在的函数体。

  • 第三步是转到下一个函数,第一步创建的对象超出了作用域,所以调用了它们的析构函数。

这里甚至不需要const,但大多数编译器都会警告您使用temporal初始化引用。

该解决方案不适用于没有构造函数的类型,int test (int &i=int());将失败(至少在VisualStudio2008中是error C2440: 'default argument' : cannot convert from 'int' to 'int &'