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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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 附加事件