《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; }
相关文章推荐
- “Accelerated C++” 阅读笔记(四)
- 【c++】计算工资
- 【c++】计算工资
- C++编译问题
- 排序算法-C++
- C++实现静态顺序表的增删查改以及初始化
- C语言中整型的定义
- 栈空间和堆空间
- 介绍C++11标准的变长参数模板
- 【c++】【2015华为笔试】分解字符串
- 【c++】【2015华为笔试】分解字符串
- C语言交换赋值函数
- C++中delete和delete[]的区别
- C++学习之路-开篇
- Java通过JNI调用C/C++
- C/C++拾起
- C++中的 typedef Vec<uchar, 3> Vec3b; 是何意?
- C++库文件包含
- [leetcode] Single Number III
- C语言中函数参数不确定的情况