我有一个简单的问题。在我的计算机课上,有人告诉我,当你想修改原始输入并将其存储在参考内存中以备将来访问时,需要使用一个参考参数。你可以在变量的末尾附加一个&来完成这一操作,例如对于函数: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(字符串&名称)是执行所需功能的唯一有效语法。
1条答案
按热度按时间sulc1iza1#
在本例中,由于您输入的是John Smith,因此下面的void函数似乎不应使用引用参数,而应使用常规参数
void readName(string name)
在将John Smith输入到
name
中之后,name
将变为“John Smith,”但传入的原始参数是:读取名称(名称);
这个
name
不受影响,如果它仍然是原来的默认空字符串,那么它仍然和以前一样空。main()
中的name
和readName()
中的这个name
参数完全没有任何关系,它们是两个完全不同的对象,只是碰巧同名。将
main
中的name
传递到void readName(string name)
中会创建main
的name
的副本,而这个复制的对象将成为readName
的名称。这就是C中通过值传递参数(与通过引用传递参数相对)的含义。你可以随意地把你想要的任何东西“输入”到这个
name
中。它不会对main
的原始name
有任何影响。但它不使用引用参数:它被设置为void readName(字符串&名称)
而现在,在将约翰·史密斯“输入”到这个
name
之后,猜猜main
的原始name
会发生什么。只要大胆猜测一下。尽你所能。你知道吗你的猜测是对的。这最终是将John Smith”输入“到
main
的实际name
对象中。因为它是通过“by reference”传递的。这就是“by reference”在C中的意思。它指的是被传递的原始对象。