暂时忽略(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
}
请注意,它在语义上会创建一个副本,但允许编译器在某些条件下删除副本。查找复制省略
通过参考。我可以修改调用者传递的参数。
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 正确性。