教程c ++参考参数问题

时间:2015-07-07 08:55:22

标签: c++

我对C ++参考参数有些怀疑。我正在从这个网站上学习:

fehleranzahl.setText(klartextWort); 

第一个程序:

http://www.doc.ic.ac.uk/~wjk/c++Intro/RobMillerL3.html

然后作者建议"在某些情况下,要求一个函数来修改它传递的实际参数的值是合法的。之后他引入了新的函数:

#include<iostream>
using namespace std;

int area(int length, int width);        

int main()
{
    int this_length, this_width;

    cout << "Enter the length: ";              
    cin >> this_length;
    cout << "Enter the width: ";
    cin >> this_width;
    cout << "\n";                               

    cout << "The area of a " << this_length << "x" << this_width;
    cout << " rectangle is " << area(this_length, this_width) << endl;

    return 0;
}

int area(int length, int width)   
{
    int number;
    number = length * width
    return number;
}

将值作为参数传递时的主要优势是什么?

3 个答案:

答案 0 :(得分:3)

通过引用传递的优点:

  1. 它允许我们让函数改变参数的值,这有时是有用的。
  2. 因为没有创建参数的副本,所以它很快,即使与大型结构或类一起使用也是如此。
  3. 我们可以通过const引用来避免无意的更改。
  4. 我们可以从函数返回多个值。
  5. 通过引用传递的缺点:

    1. 因为无法对文字或表达式进行非const引用,所以引用参数必须是普通变量。
    2. 很难判断通过引用传递的参数是输入,输出还是两者。
    3. 无法从函数调用中判断出参数可能会发生变化。通过值传递并通过引用传递的参数看起来是相同的。我们只能通过查看函数声明来判断参数是通过值还是引用传递的。这可能导致程序员没有意识到函数会改变参数值的情况。
    4. 因为引用通常由C ++使用指针实现,并且取消引用指针比直接访问它更慢,访问通过引用传递的值比访问值传递的值要慢。
    5. <强>来源

      1. http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

      2. http://www.functionx.com/cppcli/functions/Lesson10b.htm

      3. https://en.wikibooks.org/wiki/C++_Programming/Code/Statements/Functions

答案 1 :(得分:1)

已经有了一个很好的答案(imho值得接受)。但是,我想提供一个更基本的答案,因为您似乎第一次遇到了参考文件:

此功能:

void foo(int x){x +=1;}

可以对传递的(按值)参数的值做任何事情,但它没有机会向调用者返回任何内容,即x+=1几乎没有任何影响。

另一方面,这个功能:

void bar(int& x){x +=1;}

不仅获取值,而且还处理您作为参数传递的实际变量(通过引用)。因此x+=1在函数之外也有效。

两个功能都在起作用:

int main(){
    int a = 1;
    foo(a);      // foo gets a copy of a and increments its value
                 // a is still 1
    bar(a);      // bar directly increments the value of a
                 // a is now 2
}

这是通过引用(bar)传递参数与传递值(foo)的主要区别。通过引用传递的主要优点是不需要复制参数的值。 (这就是为什么通过值传递通常使用const引用。传递const引用就像传递值一样,因为即使实际传递了引用,也无法更改值。)但是,有关更多详细信息,请参阅Rohits的答案。 / p>

答案 2 :(得分:1)

int &a是对传递给该函数的任何参数的引用,您应该始终将引用视为变量的别名(它类似于const指针)。

如果您的引用不是const,则允许您更改,因此更改原始变量的内容。

它有用很多原因首先它可以通过参考传递参数避免复制来提高性能,如果你有一个你希望返回多个结果的函数,例如=:

int f (int &a,int &b,int &c,int&d);

int main
{
    int first,second,third,result;
    result = f(first,third,result);
} 

您的所有int变量都可以在您的功能中更改。