将参数传递给自动转换为指针的函数

时间:2011-07-26 03:51:07

标签: c++ function arguments implicit-conversion

注意:我正在使用g ++编译器(我听说这很好,并且应该非常接近标准)。


所以,我想我已经知道将指针传递给数组或将实际数组作为参数传递给另一个函数总是会导致传递一个指向该数组的指针。

同样地,我想我已经知道将指针传递给函数或将实际函数作为参数传递给另一个函数总是会导致传递指向该函数的指针。

是否可以传递数组的副本(没有在被调用函数中显式复制数组)?

是否可以传递函数的副本(没有在被调用函数中明确地复制函数)?这有用吗?这甚至意味着什么?

我理解传递数组或其副本之间的区别;传递函数或其副本有什么区别?

2 个答案:

答案 0 :(得分:2)

C不能通过值传递数组,或者更通常地复制数组(除非手动)。 C ++继承了这一点,所以不可能。更好的方法是使用std::array(对于C ++ 0x; boost::array是相同的并且可用于C ++ 03),这是一种可复制类型,可以通过值传递。

int i[] = { 1, 2, 3 }; // type is int[3]
int j[3] = i; // error: can't copy an array
// C style would be to let j unitialized and to copy the values of
// i individually:
// int j[3]; std::copy(i, i + 3, j);

std::array<int, 3> ii = {{ 1, 2, 3 }};
std::array<int, 3> jj = ii; // Okay

在任何一种语言中都无法复制函数,而且与数组不同,它不可能“手动”完成。 “复制一个函数”在这些语言中没有意义。


  

是否可以传递函数的副本(没有明确说明   在被调用函数内制作函数的副本)?就是它   有用吗?这甚至意味着什么?

  

“复制函数”用什么语言才有意义?

Lua允许读取函数的字节代码,它可以在以后重复使用(或者在另一个解释器中重用)来重构函数。我还假设Lisp在适当的情况下可以使用它的代码作为数据方法。请注意,在这两种语言中,这样做并不常见,并且将其称为“复制函数”并不是惯用的。

这种事情在int i = j;意义上的复制较少,i是副本,但通常更接近于编组/序列化的概念。也就是说,将运行时数据*转换为可以存储和/或传输的更持久的形式(例如,通过网络)。

*:在这些语言(以及其他语言)中,与C和C ++不同,函数是数据。

答案 1 :(得分:0)

  

(1)是否可以传递数组的副本(没有明确地制作   被调用函数内的数组副本??

在C ++中,您可以通过引用传递:

int a[100];
foo(a);

现在foo()将是,

void foo (int (&arr)[100])
{
}

所以,在这里你不要复制a,但你仍然可以在foo()内使用它,并使用与你在外面使用它相同的规则。

编辑:如果您希望按值传递数组而不制作它的明确副本,那么您可以考虑将其放入struct包装并传递它:

struct Array { int a[100]; } myArr;
foo(myArr);
void foo(Array myArr);
  

(2)是否可以传递函数的副本(没有明确说明)   在被调用函数内制作函数的副本)?就是它   有用吗?这甚至意味着什么?

同样的事情,你可以通过引用传递。就其有用性而言,它在大多数情况下与函数指针一样有用。但这在C ++中并不常见。

void foo (int i) {}
typedef void (pf)(int);
void pass (pf &ptr)
{
  ptr(0);
}

int main ()
{
  pass(foo);
}

修改:如果您要求制作上述副本,那么就功能而言是不可能的。因为它没用。