C++ const_cast 和重载

千白莫

关注

阅读 12

2024-10-10

在4.11.3节(第145页)中我们说过,const_cast 在重载函数的情景中最有用。举个例子,回忆6.3.2节(第201页)的shorterstring 函数:

//比较两个string对象的长度,返回较短的那个引用
const string &shorterString(const string &sl,const string &s2)
{
    return sl.size()<= s2.size()?s1:s2;
}

这个函数的参数和返回类型都是const string的引用。我们可以对两个非常量的 string 实参调用这个函数,但返回的结果仍然是 const string 的引用。因此我们需要一种新的shorterstring函数,当它的实参不是常量时,得到的结果是一个普通的引用,使用const_cast可以做到这一点:

string &shorterString(string &sl,string &s2)
{
    auto &r=shorterString(const_cast<const string&>(sl),
                          const_cast<const string&>(s2));
    return const_cast<string&>(r);
}

在这个版本的函数中,首先将它的实参强制转换成对const的引用,然后调用了shorterstring函数的const版本。const版本返回对const string 的引用,这个引用事实上绑定在了某个初始的非常量实参上。因此,我们可以再将其转换回一个普通的string&,这显然是安全的。

const string &shorterString(const string &s1, const string &s2)
{
    return s1.size() <= s2.size() ? s1 : s2;
}

string &shorterString(string &s1, string &s2)
{
    auto &rs = shorterString(const_cast<const string &>(s1),
        const_cast<const string &>(s2));
    return const_cast<string &> (rs);
}

int main()
{
    const string &ss1("123");
    const string &ss2("1234");
    const string &r1 = shorterString(ss1, ss2);
    cout << r1 << '\n';

    string s1("456");
    string s2("45678");
    string &r2 = shorterString(s1, s2);
    cout << r2 << '\n';

    system("pause");
    return EXIT_SUCCESS;
}

输出:

123
456


《C++ Primer》 P209




精彩评论(0)

0 0 举报