是在C++中通过'隐含'(?)引用时复制的

fig*_*ief 1 c++ c++11

如果我有一个引用地图的函数:

pair<int,int> myFunc(map<int,char> &myVar){...}
Run Code Online (Sandbox Code Playgroud)

我可以传递一张地图而不需要'&'.

myFunc(someMapitoa);
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?是制作副本然后扔掉?我应该使用'&'吗?

era*_*ert 5

默认情况下,C++是按值传递的.

所以,这是一个副本:

void foo (bar b);
Run Code Online (Sandbox Code Playgroud)

这不是:

void foo (bar & b);
Run Code Online (Sandbox Code Playgroud)

这会生成指针的副本,但不会指向它指向的实际数据:

void foo (bar * b);
Run Code Online (Sandbox Code Playgroud)

如果你真的想深入了解它,那么请看这篇关于移动语义的SO帖子.

无论如何,对于上面三个例子,它们都被称为相同的方式:

#include <iostream>
using namespace std;

int alpha (int arg) {
    // we can do anything with arg and it won't impact my caller
    // because arg is just a copy of what my caller passed me
    arg = arg + 1;
    return arg;
}

int bravo (int & arg) {
    // if I do anything to arg it'll change the value that my caller passed in
    arg = arg + 1;
    return arg;
}

int charlie (int * arg) {
    // when we deal with it like this it's pretty much the same thing
    // as a reference even though it's not exactly the same thing
    *arg = *arg + 1;
    return *arg;
}

int main () {
    int a = 0;

    // 1
    cout << alpha (a) << endl;
    // 1
    cout << bravo (a) << endl;
    // 2
    cout << charlie (&a) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)