在c ++中,为什么传递引用是由被调用者而不是调用者来定向的

时间:2017-12-07 17:01:16

标签: c++

在c ++中,函数签名定义它将通过引用或值获取参数。是不是调用者应该通过引用或值来决定它想传递什么? 假设调用者不希望函数修改其值,并且不确定调用者在其函数内做了什么。然后调用者无权说不应修改参数。

这个C ++定义如何合理?

3 个答案:

答案 0 :(得分:0)

这样做是为了使重载更加通用,并且因为解释器根据您传递的参数决定调用哪个函数。说我有两个功能

void add(int* a, int* b){
    *a= *a+*b;
    *b = *a;
}

int add(const& int a, const& int b){
    return a+b;
}

这是添加两个数字的两种截然不同的方式。当我调用这些函数时,解释器根据我传递的内容知道要调用哪个函数。

答案 1 :(得分:0)

按引用调用与按值调用主要不是“修改”与“只读”。 calc用于指示参数是否为只读。功能设计中的逐个引用与按值调用的选择通常与性能影响有关。

例如,const通常是寄存器,而int会将指针传入寄存器但需要取消引用才能访问。这在结构/类中最为明显,其中传递值将涉及复制大于机器字的内存块和/或在临时值上调用构造函数/析构函数。

例如,此函数需要临时生成,ctor / dotr循环,可能在每次调用时都有堆分配:

int *

虽然这个仍然是只读的,但是避免了额外的临时性:

void foo(const std::string s);

调用程序可以明确地看到函数如何获取参数的设计选择,这样开发人员就可以根据其使用方式进行与性能相关的权衡。 C / C ++代码性能在很大程度上基于将数据放在正确的位置,并以正确的方式传递对它的引用。

  

至于“这在C ++中是如何合理的”问题,请参阅Stroustrup,“C ++的设计与演变”,Addison-Wesley(1994)

答案 2 :(得分:0)

总是调用者根据参数类型“决定”调用者调用什么。有严格的解决规则非常合理。搜索C ++重载决策。例如:http://en.cppreference.com/w/cpp/language/overload_resolution

不同的重载是源代码中具有相同名称的不同函数,它们具有不同的错位名称但不在目标文件中。