【问题标题】:When to use a reference parameter in C++ function design在 C++ 函数设计中何时使用引用参数
【发布时间】:2022-11-21 10:49:11
【问题描述】:

我有一个简单的问题。在我的计算机课上,我被告知当您想修改原始输入并将其存储在参考内存中以供将来访问时,将使用参考参数。您将 & 附加到变量的末尾以执行此操作,例如对于函数:void firstName(string name)

然而,我正在审查我的实验室导师的一个程序,你在其中输入你的名字和姓氏,例如 John Smith,它输出为 Smith, John。

在这种情况下,当您输入 John Smith 时,似乎以下 void 函数不应使用引用参数,而应使用常规参数 void readName(string name)

除非它没有,否则它使用一个参考参数:它被设置为 void readName(string& name)

为什么在这种情况下使用参考参数?在我看来,它只是提取名称然后对其进行计算?我看不到字符串的修改在哪里发生以证明它是一个参考参数。

任何帮助将非常感激。

非常感谢..

//
// 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(string name) 在此程序中工作,但事实并非如此。 void readName(string& name) 是唯一适用于执行所需功能的语法。

【问题讨论】:

  • 在我看来,它只是提取名称然后对其进行计算?“你怎么看?readName 只是读取名称。这需要将名称写在后续代码可以看到的地方。”我看不到字符串的修改在哪里发生以证明它是一个参考参数。“这是readName的部分读名字.
  • 除了参考参数(您的讲师可能将它们用于教学目的),我更喜欢没有任何参数的std::string readName()

标签: c++


【解决方案1】:

在这种情况下,当您输入 John Smith 时,它似乎是 下面的 void 函数不应该使用引用参数而只是一个 普通的,void readName(string name)

然后在“输入 John Smith”到这个 name 之后,这个 name 将是“John Smith”,但是传入的原始参数:

读取名称(名称);

这个特定的name 不受影响。如果它仍然是原始的、默认的、空字符串,它仍然和以前一样空。

main() 中的 namereadName() 中的 name 参数彼此之间绝对没有任何关系。它们是两个完全不同的对象,只是偶然碰巧具有相同的名称。

namemain 传递到 void readName(string name) 会创建 mainname 的副本,并且这个复制的对象成为 readName 的名称。

随意“输入”你想要的任何东西到这个name。它不会对main的原始name产生任何影响。

除了它没有,它使用一个参考参数:它被设置为 void 读取名称(字符串和名称)

现在,在将 John Smith“输入”到这个 name 之后,猜猜 main 的原始 name 会发生什么。随便猜一猜。尽你最大的努力。

好吧,你知道什么:你的猜测是正确的。这最终将“输入 John Smith”到 main 的实际 name 对象中。因为它是“通过引用”传递的。这就是 C++ 中“by reference”的意思。它指的是传入的原始对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多