按值传递/引用是按实现定义的还是按行为定义的? Q:通过强>行为> >或>强> >实现> /St>>WISE C++,您能提供权威引用吗?p> 在C++中,我与朋友进行了关于传递值/引用的转换。我们对传递值/引用的定义产生了分歧。我理解,将指针传递给函数仍然是按值传递,因为指针的值是复制的,并且此副本在函数中使用。随后,取消对函数中指针的引用并对其进行变异将修改原始变量。这就是出现分歧的地方

按值传递/引用是按实现定义的还是按行为定义的? Q:通过强>行为> >或>强> >实现> /St>>WISE C++,您能提供权威引用吗?p> 在C++中,我与朋友进行了关于传递值/引用的转换。我们对传递值/引用的定义产生了分歧。我理解,将指针传递给函数仍然是按值传递,因为指针的值是复制的,并且此副本在函数中使用。随后,取消对函数中指针的引用并对其进行变异将修改原始变量。这就是出现分歧的地方,c++,C++,他的立场:仅仅因为指针值被复制并传递给函数,对取消引用的指针执行操作就能够影响原始变量,因此它具有按引用传递的行为,将指针传递给函数 我的立场:将指针传递给函数会复制指针的值,函数中的操作可能会影响原始变量;然而,仅仅因为它可能会影响原始的,这种行为并不构成它是通过引用传递的,因为它是定义这些术语、通过值/引用传递的语言的实现 引用投票率最高的答案给出的定义: 通过参考传递 当参数通过引用传递时,调用者和被调用者对参数使用相同的变量。如果被调用者修改参数变量,则调用者的变量可以看到效果 传递值

他的立场:仅仅因为指针值被复制并传递给函数,对取消引用的指针执行操作就能够影响原始变量,因此它具有按引用传递的行为,将指针传递给函数

我的立场:将指针传递给函数会复制指针的值,函数中的操作可能会影响原始变量;然而,仅仅因为它可能会影响原始的,这种行为并不构成它是通过引用传递的,因为它是定义这些术语、通过值/引用传递的语言的实现

引用投票率最高的答案给出的定义:

通过参考传递

当参数通过引用传递时,调用者和被调用者对参数使用相同的变量。如果被调用者修改参数变量,则调用者的变量可以看到效果

传递值

当参数按值传递时,调用者和被调用者有两个具有相同值的自变量。如果被调用者修改参数变量,则调用者看不到效果

看完这些,我还是有一种模棱两可的感觉。例如,传递值/参考报价可以支持我们的任一声明。有谁能澄清这些定义是源于行为还是实施,并提供引用?谢谢

编辑:我应该更加小心我的词汇。让我进一步澄清我的问题。当我引用引用时,我的意思是“强>不<强”,只讲关于<强>和>强>引用的C++实现,而不是理论。在C++中,通过引用的<强>和<强>是真的PBR,因为它不仅可以修改原始值,而且可以修改值的内存地址。这就导致了这个例子,指针也算作PBR

void foo(int ** bar){
    *bar = *bar+(sizeof(int*));
    cout<<"Inside:"<<*bar<<endl;
}

int main(){
    int a = 42;
    int* ptrA = &a;
    cout<<"Before"<<ptrA<<endl;
    foo(&ptrA);
    cout<<"After:"<<ptrA<<endl;
}
void foo(int**bar){
*bar=*bar+(sizeof(int*);

CUT

这里你经常讨论指针,它们确实是大部分时间通过的,但是你没有提到实际的C++引用,它们是实际的引用。

int a{};
int& b = a;

// Prints true
std::cout << std::boolalpha << (&b == &a) << std::endl;
inta{};
int&b=a;
//打印正确

STD::CUT> P>引用与指针不同。引用的主要原因是支持操作符重载。C++是从C派生的,在这个过程中指针是从C. As Stroustrup继承的: C++继承了C中的指针,因此我无法删除它们而不会造成严重的兼容性问题。

因此,实际上有三种不同的参数传递方式:

  • 传递值
  • 参照&
  • 通过指针
现在,通过指针传递与通过引用传递具有相同的效果。那么如何决定要使用什么呢?回到Stroustrup所说的:

这取决于您想要实现的目标: 如果要更改传递的对象,请通过引用调用或使用指针;例如void f(X&);或void f(X*); 如果您不想更改传递的对象,并且该对象很大,请通过常量引用调用;例如void f(const X&); 否则,按值调用;例如void f(X);


REF:

值/引用传递(您忘记了通过使用指针将地址传递到内存中的一个)是C++实现的一部分。 还有一种方法可以通过地址将变量传递给函数。通过地址传递参数包括传递参数变量的地址(使用指针)而不是参数变量本身。因为参数是地址,所以函数参数必须是指针。然后函数可以取消对指针的引用以访问或更改指向的值

看看我一直认为是权威来源的东西:

你在值传递时复制的值是正确的。这是C++中的默认行为。通过值传递给函数的优点是当函数被传递到函数中时,函数不能改变原始值,这样可以防止在修改AgMug值时出现任何不必要的错误和/或副作用。新界

通过值传递的问题是,如果您将整个结构或类多次传递到函数中,将导致巨大的性能损失,因为您将传递试图传递的值的完整副本,而对于类中的mutator方法,您将无法更改原始值,因此将结束创建您试图修改的数据的多个副本,因为您将被迫从函数本身而不是从数据结构所在的内存位置返回新值。这完全是低效的

您只希望在不必更改参数值的情况下按值传递

这是一个关于这个话题的好消息来源

现在,如果需要更改数组、类或stru的参数值,则需要使用“通过引用传递”行为
void foo(int& i) {
    i++;
}

int main() {
    int i{};

    foo(i);

    // prints 1
    std::cout << i << std::endl;
}