我回来了&特别是自从我开始使用OpenCV库以来,这个问题已经有一段时间了。事实上,在OpenCV中,使用了几种方法:
当然,对应于每种方法,调用者格式和函数实现应该是不同的。
所有这些衍生物的意义何在?特别是最后一个(我还没有理解它的用法)
答案 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。