• c++ primer 5th 笔记:第四章


    第四章:表达式

      笔记:

        1. 当运算符作用于类类型的运算对象时,用户可以自行定义其含义

        2. 在表达式求值过程中,运算对象常常由一种类型转换成另一种类型。小整数类型(如bool、char、short等)通常会被提升成较大的整数类型,主要是int。

        3. 当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)

        4. 参与取余运算对象必须是整数类型。

        5. c++11新标准规定整数相除的商一律向0取整(即直接切除小数部分)。

        6. 逻辑与(&&)和逻辑或(||)满足短路求值的策略。

        7. 赋值运算符的左侧运算对象必须是一个可修改的左值

        8. c++11新标准允许使用花括号括起来的初始值列表作为赋值语句的右侧运算对象:

        vector<int> vi;
        vi = {0, 1, 2, 3, 4, 5,6, 7, 8, 9};  // 正确:vi现在含有10个元素了,值从0到9

        9. 赋值运算满足右结合律:

        int ival, jval;
        ival = jval = 0;    //  正确:都被赋值为0

        10. 建议:除非必须,否则不用递增递减运算符(++ --)的后置版本。

        11. 简洁输出表达形式,被广泛使用、有效的形式:

        cout << *iter++ << endl;     // 要习惯于这种写法

        不断研究这样的例子直到对它们含义一目了然。    

        12. 强烈建议仅将位运算用于处理无符号类型。 

        13. sizeof运算符返回一条表达式或一个类型名字所占的字节数。

            注意:对数组执行sizeof运算得到整个数组所占空间的大小,sizeof运算不会把数组名转换成指针来处理

                int ia[] = {1, 2, 3, 4, 5, 6};
            constexpr size_t sz = sizeof(ia) / sizeof(*ia);  // 计算数组中元素的个数
                int arr[sz];     // 正确:sizeof返回一个常量表达式

        14. 类型转换中的隐式转换:自动执行,无须程序员的介入,有时甚至不需要程序员了解。

        15. 整型提升负责把小整数类型转换成较大的整数类型。

        16. 其他隐式类型转换:a. 数组转换成指针(大多数情况下)。

                   b. 指针的转换

                   c. 转换成布尔类型( char *cp = get_string(); if (cp)  /*...*/)

                   d. 转换成常量

                   e. 类类型定义的转换

     

          string s, t = a value";
          while (cin >> s)       // while 的条件部分把cin转换成布尔值
                                    // IO库定义了从istream向布尔值转换的规则

      重点知识点总结:

          显式类型转换

          1. static_cast

            任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。如:

            // 进行强制类型转换以便执行浮点数除法
            double slope = static_cast<double>(j) / i;

          2. const_cast

            const_cast只能改变运算对象的底层const。对于将常量对象转换成非常量对象的行为,我们一般称为“去掉cosnt性质”。例如:

          const char *pc;
          char *p = const_cast<char*>(pc);  // 正确:但是通过p写值是未定义的行为
                // 一旦去掉某个对象的const性质,编译器就不再阻止我们对该对象进行写操作了
                //如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为
                //如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果
            const char *cp;
            char *q = static_cast<char *>(cp);   // 错误:static_cast不能转换掉const性质
            static_cast<string>(cp);     // 正确:字符串字面值转换成stirng类型    ???
            const_cast<string>(cp);    // 错误:const_cast只能改变常量属性

          3. reinterpret_cast

            reinterpret_cast 通常为运算对象的位模式提供较低层次上的重新解释

            int *ip;
            char *pc = reinterpret_cast<char*>(ip);  // 我们必须牢记pc所指真实对象是一个int而非字符

          旧式的强制类型转换:

            char *pc = (char *) ip;    // ip是指向整数的指针
                  // 效果与使用reinterpret_cast一样

           注意:强烈建议程序员避免使用强制类型转换

      术语

        重载运算符(overloaded operator)、右值(rvalue)、左值(lvalue)、隐式转换(implicit comversion)、

        算术转换(arithmetic conversion)、整型提升(integral promotion)、强制类型转换(cast)。

                                                        2016-10-28

  • 相关阅读:
    sqlserver建立临时表
    动态引用WebService
    技术的力量:30分钟的动画片和《彗星撞地球》超炫的动画 仅64K
    sqlserver2005新功能函数
    使用面向对象的、完整的单点登录功能
    asp.net上传功能(单文件,多文件,自定义生成缩略图,水印)
    C#对字符和文件的加密解密类
    JavaScript中setInterval函数应用常见问题之一(第一个参数不加引号与加引号的区别)
    JavaScript表格隔行换色悬停高亮
    Javascript模拟c#中arraylist操作(学习分享)
  • 原文地址:https://www.cnblogs.com/wzhe/p/6003943.html
Copyright © 2020-2023  润新知