(我是C ++的初学者。但我熟悉其他一些程序。语言,特别是Java。)
有谁能帮我找到这个C ++代码中的缺陷?
string & getFullName(string name, bool male){
string fullName = name;
if (male) {
fullName = string(” Mr. ”) + fullName;
return fullName;
}
}
答案 0 :(得分:10)
至少有三个问题:
首先,您将返回对局部变量的引用。
其次,return
为male
时没有false
。我的意思是,如果if
块没有被执行怎么办?你的功能会回归什么?这种情况没有退货声明。
“Mr. ”
不是字符串文字。 "Mr. "
是一个字符串文字。注意区别。修复可以是这样的:
string getFullName(string name, bool male)
{
if (male)
{
return string("Mr. ") + name;
}
else
{
return "Ms. " + name; //No need to write even `string("Ms.")`
}
}
不需要局部变量。
或者简单地说:
string getFullName(string name, bool male)
{
return (male ? string("Mr. ") : string("Ms. ")) + name;
}
答案 1 :(得分:2)
您正在返回对局部变量的引用。理想情况下,一旦函数getFullName返回,fullName将会死亡,如果你尝试为它分配类似
的东西string myName = getFullName("Adam",true);
myName
将是垃圾。
答案 2 :(得分:1)
不要返回对local的引用并删除单个左卷曲:
void makeFullName(string &name, bool male){
if (male) /* remove the curly */
name = string(“Mr. ”) + name;
}
答案 3 :(得分:1)
fullname 的范围仅限于此功能,因此一旦此功能结束或超出范围, fullname 将从堆栈中删除。因此,当您返回 fullname 的引用时,将返回已刷新内存的地址,因此您将获得垃圾值。 另一个问题是,当男性的条件为假时,您没有返回任何内容。
答案 4 :(得分:0)
你可能想要更像这样的东西:
std::string getFullName(string const &name, bool male) {
std::string ret = "Mr. ";
if (male)
return ret+name;
return name;
}
另一种可能性还可以更容易地为女性添加标题'如果你选择了名字:
std::string getFullName(string const &name, bool male) {
static const std::string titles[] = {std::string(""), std::string("Mr. ")};
return titles[male] + name;
}
如果您确实想要为女性姓名添加标题,只需将其插入上面的空字符串即可。