在函数中传递参数 - OpenCV& CPP

时间:2012-08-28 07:01:17

标签: c++ opencv argument-passing

我回来了&特别是自从我开始使用OpenCV库以来,这个问题已经有一段时间了。事实上,在OpenCV中,使用了几种方法:

  • 1st:funcA((const)CvMat arg)
  • 2nd:funcA((const)CvMat& arg)
  • 3rd:funcA((const)CvMat * arg)
  • 4th:funcA((const)CvMat *& arg)=>我刚刚看到并且目前被困在这个

当然,对应于每种方法,调用者格式和函数实现应该是不同的。

所有这些衍生物的意义何在?特别是最后一个(我还没有理解它的用法)

1 个答案:

答案 0 :(得分:5)

暂时忽略(const),并为了清晰起见使用int

按值传递会在函数体中复制

void funcA(int arg) {
  // arg here is a copy
  // anything I do to arg has no effect on caller side.
  arg++; // only has effect locally
}

请注意,它在语义上进行复制,但允许编译器在某些条件下删除副本。查看copy elision

通过参考传递。我可以修改调用者传递的参数。

void funcA(int& arg) {
  // arg here is a reference
  // anything I do to arg is seen on caller side.
  arg++;
}

按值传递指针 。我得到一个指针的副本,但它指向调用者的参数

指向的同一个对象
void funcA(int* arg) {
  // changes to arg do not affect caller's argument
  // BUT I can change the object pointed to
  (*arg)++; // pointer unchanged, pointee changed. Caller sees it.
}

传递对指针的引用。我可以更改指针本身,调用者将看到更改。

void funcA(int*& arg) {
  // changes to arg affect caller's argument
  // AND I can change the object pointed to.
  (*arg)++; // pointee changed
  arg++; // pointer changed. Caller sees it.
}

正如你所看到的,后两个与前两个相同,只是它们处理指针。如果您了解指针的作用,那么概念上没有区别。

关于const,它指定是否可以修改参数,或者,如果参数是引用或指针,是否可以修改它们指向/引用的参数。 const的定位在这里很重要。例如,请参阅const correctness