这个C ++代码的缺陷是什么?

时间:2012-07-12 04:47:58

标签: c++

(我是C ++的初学者。但我熟悉其他一些程序。语言,特别是Java。)

有谁能帮我找到这个C ++代码中的缺陷?

string & getFullName(string name, bool male){
    string fullName = name;
    if (male) {
        fullName = string(” Mr. ”) + fullName;
        return fullName;
    }
}

5 个答案:

答案 0 :(得分:10)

至少有三个问题:

  • 首先,您将返回对局部变量的引用。

  • 其次,returnmale时没有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;
}

如果您确实想要为女性姓名添加标题,只需将其插入上面的空字符串即可。