是否在C++中通过"隐含"(?)引用时制作的副本

Is a copy made when passing by 'implied'(?) reference in C++

本文关键字:引用 副本 C++ 隐含 是否      更新时间:2023-10-16

如果我有一个引用映射的函数:

pair<int,int> myFunc(map<int,char> &myVar){...}

我可以把地图传给它,而不需要"&"。

myFunc(someMapitoa);

有什么不同吗?是复制后扔掉的吗?我应该使用"&"无论如何

C++默认为按值传递。

因此,这是一个副本:

void foo (bar b);

这不是:

void foo (bar & b);

这会复制指针,但不会复制它所指向的实际数据:

void foo (bar * b);

如果你真的想更深入地了解它,那么看看这篇关于移动语义的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;
}

您应该从初始化内容的角度来考虑这一点。

调用函数时,每个参数都用于初始化相应的参数。如果参数是用引用类型声明的,那么它就是一个引用。如果参数没有用引用类型声明,那么它就是一个对象。

  • 从类型为T的表达式初始化对类类型T引用从不进行复制
  • 从类型为T的表达式初始化类别为T对象可以复制或移动

这里的规则与初始化非参数变量的规则相同,如:

T t = ...
T& r = ...

即使在调用位置没有显式表示法的情况下,函数也可能引用参数,这一事实被一些人认为是令人困惑的。这就是为什么一些样式指南禁止非const引用参数(如Google C++样式指南),并强制您将该参数声明为指针,以便必须在调用站点使用&。我不提倡这种编码风格,但这是您可能需要考虑的一个选项。