【问题标题】:passing argument in function - OpenCV & Cpp在函数中传递参数 - OpenCV & Cpp
【发布时间】:2012-08-28 07:01:17
【问题描述】:

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

  • 第一个:funcA((const) CvMat arg)
  • 第二个:funcA((const) CvMat& arg)
  • 第三个:funcA((const) CvMat* arg)
  • 4th: funcA((const) CvMat*& arg) => 我刚刚看到并且目前被困在这个

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

所有这些衍生品有什么意义?尤其是最后一个(我还没弄明白它的用法)

【问题讨论】:

  • 第四个允许您更改函数中的参数,即调用者调用 funcA (ptr) 并在您编写的函数中将 ptr 指向某个东西 arg = p; ,并且从函数ptr返回后指向p的目标。
  • '&' 怎么样?只是为了解放功能用户的思想吗?即调用者:funcA(pointer)(它不是调用者:funcA(&pointer))
  • 那么,和funcA(CvMat* arg)有什么区别,在funcA中,我觉得还是可以赋值arg = some_other_pointer ??
  • 前两个或后两个调用者的语法没有太大的不同。但是语义完全不同。查找按值传递和按引用传递。

标签: c++ opencv argument-passing


【解决方案1】:

暂时忽略(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

【讨论】:

  • 在您的第三个示例中,执行 funcA 后, *arg 指针被更改,但 arg 指针在调用者的范围内保持不变。那正确吗?即使我在 funcA 中添加了 arg++?
  • 您的意思是,我认为您在上一个示例中的评论并不准确。 “对 arg 的更改不会影响调用者的参数”应该是“对 arg 的更改会影响调用者的参数”。此外,我可以更改 funcA 中的指针和指针,例如: (*arg)++;参数++;我理解的对吗??
  • @SonLe 你是对的,这是上一个例子中的错字。你没看错!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2016-01-18
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多