《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 }


 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM