《C++ Primer》学习 之 const_cast使用
/*
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主要适用于类似示例程序的参数传递,
而不是为了将常量转换成非常量以达到修改原常量值的目的。
*/
1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 #include <iostream> 4 #include <stdexcept> 5 #include <ctype.h> 6 #include <locale> 7 #include <iterator> 8 #include <cmath> 9 #include <string> 10 #include <vector> 11 #include <initializer_list> 12 #include <ctime> 13 using namespace std; 14 15 // const版本 16 const string &shorterString(const string &s1, const string &s2) 17 { 18 return (s1.size() <= s2.size()) ? s1 : s2; 19 } 20 21 // 目的:对两个非常量的string实参调用这个函数 22 string &shorterString(string &s1, string &s2) 23 { 24 // 实参强制转换为对const的引用,调用const版本函数得到对const string的引用 25 auto &r = shorterString(const_cast<const string &>(s1), 26 const_cast<const string &>(s2)); 27 // 转换为普通的string& 28 return const_cast<string&>(r); 29 } 30 31 32 33 int main(int argc, char **argv) 34 { 35 #ifdef HOME 36 //freopen("in", "r", stdin); 37 //freopen("out", "w", stdout); 38 #endif 39 40 string str1 = "123", str2 = "4567"; 41 string &strRef = shorterString(str1, str2); 42 cout << strRef << endl; 43 44 // 字符串字面值转换为string类型 45 const char *cp = "890"; 46 string str = static_cast<string>(cp); 47 cout << str << endl; 48 49 //string str1 = const_cast<string>(cp); // error : const_cast只能改变常量属性,不能改变表达式的类型 50 51 52 #ifdef HOME 53 std::cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 54 #endif 55 return 0; 56 }