繁体   English   中英

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

[英]Default argument for structure reference in C++

我想为 function 参数提供默认值,该参数是对结构的引用。 我可以给出什么作为默认值?

第一个解决方案:

如果它是对结构的引用,那么您必须将其设为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
}

还是不好。 定义一个全局变量不是一个好主意。


最佳解决方案:定义过载 function

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指定为参数的默认值。

一个 object(它可以参考),一个现有的参考。 如果您的参数恰好是 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);

如果您通过 object,您可以这样做。 int rowCount(const QModelIndex &parent = QModelIndex()) const; 以这种方式执行:

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

  • 第二步是执行 function 主体,其中 object 存在。

  • 第三步是下一步 function,第一步创建的对象用完了 scope,所以调用了它们的析构函数。

即使 const 在这里也不是必需的,但是大多数编译器都会警告您使用临时初始化引用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM