在C++函数设计中何时使用引用参数

jjjwad0x  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(166)

我有一个简单的问题。在我的计算机课上,有人告诉我,当你想修改原始输入并将其存储在参考内存中以备将来访问时,需要使用一个参考参数。你可以在变量的末尾附加一个&来完成这一操作,例如对于函数:void firstName(字符串名称)
然而,我正在审查一个程序,从我的实验室导师,其中您输入您的名字和姓氏,例如约翰史密斯和它输出为史密斯,约翰。
在这种情况下,当您输入John Smith时,下面的void函数似乎不应使用引用参数,而应使用常规参数void readName(string name)
但它不使用引用参数:它被设置为void readName(字符串&名称)
为什么在这种情况下要使用引用参数?在我看来,这只是提取名称,然后对它进行cout操作?我看不出字符串的修改发生在哪里,以证明它是引用参数。
任何帮助都将不胜感激。
非常感谢。

//
// This program reads the first name and last name of a student,
// and prints it as last name, first name
//

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

// Function prototypes
void readName(string&);
void extract(string, string&, string&);
void printName(string, string);

// Constant declarations

int main()
{
  string name, firstName, lastName;

  char response;

  do {

    readName(name);
    extract(name, firstName, lastName);
    printName(firstName, lastName);

    cout << "Try again (Y/N)? ";
    cin >> response;
    cin.ignore(100, '\n');

  } while (tolower(response) == 'y');

  return 0;
}

// Function definitions

// Purpose: gets the student's name from a user
// Parameters: Inputs --
//             Outputs -- name -- string
//             Inputs/Outputs --
// Returns:
void readName(string& name){
  cout << "Enter student's first name and last name -- ";
  getline(cin, name);
}

// Purpose: extracts firstName and lastName
// Parameters: Inputs -- name is string
//             Outputs -- firstName and lastName are string
//             Inputs/Outputs --
// Returns:
void extract(string name, string& firstName, string& lastName){

  firstName = "";
  lastName = "";
  string::size_type i;
  for (i = 0; !isspace(name.at(i)); i++)
    firstName = firstName + name.at(i);

  for (i = i + 1; i < name.length(); i++)
      lastName = lastName + name[i];
}

// Purpose: prints firstName and lastName in the form of lastName, firstName
// Parameters: Inputs -- firstName and lastName are string
//             Outputs --
//             Inputs/Outputs --
// Returns:
void printName(string firstName, string lastName){
  cout << lastName << ", " << firstName << endl;
}

预期void readName(字符串名称)在此程序中有效,但实际上无效。void readName(字符串&名称)是执行所需功能的唯一有效语法。

sulc1iza

sulc1iza1#

在本例中,由于您输入的是John Smith,因此下面的void函数似乎不应使用引用参数,而应使用常规参数void readName(string name)
在将John Smith输入到name中之后,name将变为“John Smith,”但传入的原始参数是:
读取名称(名称);
这个name不受影响,如果它仍然是原来的默认空字符串,那么它仍然和以前一样空。
main()中的namereadName()中的这个name参数完全没有任何关系,它们是两个完全不同的对象,只是碰巧同名。
main中的name传递到void readName(string name)中会创建mainname的副本,而这个复制的对象将成为readName的名称。这就是C中通过值传递参数(与通过引用传递参数相对)的含义。
你可以随意地把你想要的任何东西“输入”到这个name中。它不会对main的原始name有任何影响。
但它不使用引用参数:它被设置为void readName(字符串&名称)
而现在,在将约翰·史密斯“输入”到这个name之后,猜猜main的原始name会发生什么。只要大胆猜测一下。尽你所能。
你知道吗你的猜测是对的。这最终是将John Smith”输入“到main的实际name对象中。因为它是通过“by reference”传递的。这就是“by reference”在C
中的意思。它指的是被传递的原始对象。

相关问题