C++ const_cast 和重载

在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

posted @   double64  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-09-29 备忘录模式 Memento
2022-09-29 状态模式 State
2021-09-29 MySQL 与 PHPStudy 中的 MySQL 有冲突的问题
2021-09-29 WPF 中使用 OpenFIleDialog
2021-09-29 WPF 附加属性
2021-09-29 WPF 依赖属性
2021-09-29 WPF 附加事件
点击右上角即可分享
微信分享提示