C++中return未保留输入值及代码结构合理性咨询
问题解答
1. 输入值输出为空的原因
你误解了问题根源——return语句并没有清除输入值,问题出在函数参数的传递方式以及返回值的处理上:
- 你的
setName和setPw函数采用值传递:调用u.setName(userName)时,传递给函数的是userName的一份副本,函数内部修改的只是这个副本,和main里的原变量完全无关。 - 函数虽然返回了输入后的副本值,但你没有把这个返回值赋值给main里的
userName和userPass,所以原变量始终保持初始的空字符串状态,自然输出为空。
调试时你看到的"值被清除",其实是函数执行完毕后,局部的副本变量被销毁,和main里的变量没有关系。
2. 代码结构与函数设计的合理性分析
当前设计的问题
你的userRegistration类完全没有成员变量来存储用户名和密码,setName和setPw更像是独立的输入函数,完全没体现类的封装性,设计不合理。
关于输入逻辑的放置
把std::cin放在set函数里是否合适,取决于你的需求:
- 如果set函数的职责是设置类的属性,输入逻辑应该放在函数外部(比如main里),先获取用户输入,再调用set函数把值传给类的成员变量,这样职责更清晰。
- 如果想让类自己处理输入逻辑,那可以写专门的输入函数(比如
inputUserName()),直接读取输入并赋值给类的成员变量,而不是现在这种既传参数又返回值的奇怪设计。
修正后的代码示例
方案1:类封装成员变量,输入逻辑在外部
#include <iostream> class UserRegistration { private: std::string userName; std::string userPass; public: void setName(const std::string& name) { userName = name; } void setPw(const std::string& pass) { userPass = pass; } const std::string& getName() const { return userName; } const std::string& getPass() const { return userPass; } }; int main() { std::string userName = ""; std::string userPass = ""; UserRegistration u; std::cout << "请输入用户名:\n"; std::cin >> userName; u.setName(userName); std::cout << "请输入密码:\n"; std::cin >> userPass; u.setPw(userPass); std::cout << "你的用户名是:" << u.getName() << "\n"; std::cout << "你的密码是:" << u.getPass() << "\n"; }
方案2:类内部处理输入逻辑
#include <iostream> class UserRegistration { private: std::string userName; std::string userPass; public: void inputUserName() { std::cout << "请输入用户名:\n"; std::cin >> userName; } void inputUserPass() { std::cout << "请输入密码:\n"; std::cin >> userPass; } const std::string& getName() const { return userName; } const std::string& getPass() const { return userPass; } }; int main() { UserRegistration u; u.inputUserName(); u.inputUserPass(); std::cout << "你的用户名是:" << u.getName() << "\n"; std::cout << "你的密码是:" << u.getPass() << "\n"; }
内容的提问来源于stack exchange,提问作者anothercrime
相关产品推荐
相关产品推荐

