C++函数设计中readName为何需使用引用参数?
为什么readName函数要使用string&引用参数而不是值传递?
你提到的核心误解是:引用参数不仅用来修改传入的已有数据,还承担着从函数向外部传递输出结果的作用,这正是readName使用引用的关键原因。
1. 引用是传递输出结果的载体
readName函数的核心功能是读取用户输入并把结果交给主函数使用。当你用string& name作为参数时,函数里的name和主函数中定义的name是同一个内存空间的别名。getline(cin, name)执行时,直接把用户输入的内容写入主函数的name变量中——这本质就是对原始变量的修改(从空字符串变成用户输入的姓名),只是这个“修改”是从零开始写入数据而已。
函数执行结束后,主函数的name已经持有了用户输入的内容,后续才能正常传给extract函数处理。
2. 值传递为什么无法正常运行
如果改成void readName(string name),函数里的name是主函数变量的局部副本。getline确实会把输入写入这个副本,但函数执行完毕后,这个副本会被销毁,主函数里的name依然是初始的空字符串。
接下来调用extract函数时,传入的是空字符串,name.at(i)会直接触发out_of_range异常,程序自然无法正常运行。
3. 额外的性能收益
string是存储动态字符序列的复杂类型,值传递时会调用拷贝构造函数复制整个字符串的内容,带来不必要的性能开销。使用引用可以完全避免这个拷贝,尤其是在处理长字符串时,效率差异会更明显。
内容的提问来源于stack exchange,提问作者user20120602
相关产品推荐
相关产品推荐

