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