zoukankan      html  css  js  c++  java
  • 《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 }
    
    
    
     
  • 相关阅读:
    URAL ——1249——————【想法题】
    bitset用法
    贪心——会场安排
    HDU 4512——吉哥系列故事——完美队形I——————【LCIS应用】
    LCS与打印路径
    URAL 1145—— Rope in the Labyrinth——————【求树的直径】
    URAL 1142——Relations——————【dp】
    HDU 5592——ZYB's Premutation——————【线段树单点更新、单点查询】
    HUD 5593——ZYB's Tree——————【树形dp】
    HDU 5587——Array——————【规律】
  • 原文地址:https://www.cnblogs.com/shijianming/p/5302522.html
Copyright © 2011-2022 走看看