您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》学习 之 const_cast使用

2016-03-21 16:30 387 查看
/*
const_cast使用:
(1)const_cast只能改变运算对象的底层const
(2)如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为
(下面的示例程序,便说明这种情况)
(3)如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果
(注:未定义行为 https://zh.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA) (4)只有const_cast能改变表达式的常量属性
(5)const_cast只能改变常量属性,不能改变表达式的类型

就我目前所了解的,我感觉:
const_cast主要适用于类似示例程序的参数传递,
而不是为了将常量转换成非常量以达到修改原常量值的目的。
*/



#define _CRT_SECURE_NO_WARNINGS
#define HOME
#include <iostream>
#include <stdexcept>
#include <ctype.h>
#include <locale>
#include <iterator>
#include <cmath>
#include <string>
#include <vector>
#include <initializer_list>
#include <ctime>
using namespace std;

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

// 目的:对两个非常量的string实参调用这个函数
string &shorterString(string &s1, string &s2)
{
// 实参强制转换为对const的引用,调用const版本函数得到对const string的引用
auto &r = shorterString(const_cast<const string &>(s1),
const_cast<const string &>(s2));
// 转换为普通的string&
return const_cast<string&>(r);
}

int main(int argc, char **argv)
{
#ifdef HOME
//freopen("in", "r", stdin);
//freopen("out", "w", stdout);
#endif

string str1 = "123", str2 = "4567";
string &strRef = shorterString(str1, str2);
cout << strRef << endl;

// 字符串字面值转换为string类型
const char *cp = "890";
string str = static_cast<string>(cp);
cout << str << endl;

//string str1 = const_cast<string>(cp); // error : const_cast只能改变常量属性,不能改变表达式的类型

#ifdef HOME
std::cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
#endif
return 0;
}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: