【共读Primer】48.[6.3]返回类型和return语句--一般返回值类型 Page199

eturn语句终止当前执行的函数,并返回控制权到上层函数。

returnreturn expression;

两种形式,一种不含有值,一种含有值或表达式

无返回值类型

void swap(int &v1, int &v2)
{
    if(v1 == v2)
        return;
    int tmp = v2;
    v2 = v1;
    v1 = tmp;
    // 此处没有显示的return语句,
    // 因为函数结束后会自行将控制权释放给上层调用者
}

带有返回值类型的函数

bool str_subrange(const string &str1, const string &str2)
{
    if (str1.size() == str2.size())
        return str1 == str2;
    auto size = (str1.size() < str2.size()) ? str1.size() : str2.size();
    for(decltype(size) i = 0; i != size; ++i)
    {
        if (str1[i] != str2[i])
            return;
    }
}

尽管C++无法保证返回值的正确性,但是可以保证类型的正确性。

但是上面的函数存在两个错误,编译的时候将会被检查出来,我们来看看。

第一个错误,我们在23行的定义中没有给出返回值

第二个错误,当for循环完结但是没有return的情况下,是没有正确的return语句的,所以会发生不是所有路径都有返回值的警告。

最后我们将代码修改为以下的形式,解决了所有问题。

#include <string>
using std::string;

void swap(int &v1, int &v2)
{
    if(v1 == v2)
        return;
    int tmp = v2;
    v2 = v1;
    v1 = tmp;
    // 此处没有显示的return语句,
    // 因为函数结束后会自行将控制权释放给上层调用者
}

bool str_subrange(const string &str1, const string &str2)
{
    if (str1.size() == str2.size())
        return str1 == str2;
    auto size = (str1.size() < str2.size()) ? str1.size() : str2.size();
    for(decltype(size) i = 0; i != size; ++i)
    {
        if (str1[i] != str2[i])
            return false;
    }
    return false;
}

int main()
{
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ChattyKu/p/9590239.html