/* 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 }