博客
关于我
《C++11Primer》阅读随记 -- 四、表达式;五、语句
阅读量:387 次
发布时间:2019-03-05

本文共 2052 字,大约阅读时间需要 6 分钟。

第四章 表达式

左值和右值

在C++语言中,左值表达式的求值结果是一个对象或函数,而某些表达式的结果虽然是对象,但它们是右值而非左值。左值和右值的主要区别在于,当对象作为左值使用时,会使用对象的身份(内存地址),而作为右值时,会使用对象的内容(值)。

常见左值运算符
  • 赋值运算符:需要一个非常量左值作为左侧运算对象,结果仍为左值。
  • 取地址运算符:作用于左值,返回指针,此时指针是右值。
  • 内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符:这些运算符的结果都是左值。
  • 内置类型和迭代器的底层递减运算符:作用于左值,强制版本的结果也是左值。
  • decltype的使用

    decltype用于获取表达式的类型。若表达式结果为左值,则结果为引用类型。例如,p为int*,*p为左值,decltype(*p)为int&。而&p为右值,decltype(&p)则为int**。

    赋值运算符

    赋值运算符的左侧运算对象必须是可修改的左值。以下操作均为非法:

    • 1024 = k:右值。
    • i + j = k:右值。
    • ci = k:ci为常量,无法修改。

    C++11允许初始值列表作为右侧运算对象,但内置类型最多只能有一个初始值,且初始值可能导致类型转换。例如:

    int a = {3.14}; // 错误:窄化转换int vi; // 初始化为空int a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 正确
    渐进式赋值

    在一条语句中混用解引用和递增运算符时,后置递增运算符优先级高于解引用。例如:

    auto pbeg = v.begin();while (pbeg != v.end() && *pbeg >= 0) {    cout << *pbeg++;    // 等价于 (*(pbeg++))}

    成员访问运算符

    点运算符和箭头运算符用于成员访问。ptr->mem等价于(*ptr).mem。

    位运算符

    位与、位或、位异或运算符在两个运算对象上逐位执行相应逻辑:

    • &:结果位为1当且仅当两位均为1。
    • |:结果位为1若至少一位为1。
    • ^:结果位为1当且仅当两位中一位为1。

    类型转换

    类型转换分为隐式和显式两种。隐式转换通常发生在算术运算和初始化时,例如int ival = 3.14 + 3中3.14和3转换为double和int。显式转换使用static_cast、const_cast、reinterpret_cast等关键字。

    指针和数组转换
    • 数组在大多数表达式中自动转换为指针,但在decltype、&、sizeof、typeid等情况下不会转换。
    • 指针转换遵循特定规则,如0或nullptr可以转换为任意指针类型。
    常量转换

    非常量不能转换为常量(const),但常量可以转换为非常量。例如:

    int i;const int& j = i; // 错误:非常量转换成const int的引用const int* p = &i; // 非常量地址转换成const地址int& r = j, *q = p; // 错误:const不能转换成非常量
    类类型转换

    类类型可以通过定义显式转换运算符实现自定义转换。例如,Sales_item类可能定义了operator+使得两个Sales_item对象相加。

    强制类型转换

    显式转换使用cast-name形式,如static_cast、const_cast、reinterpret_cast。static_cast用于明确类型转换,如double slope = static_cast<double>(j) / i。const_cast用于去掉const属性,如char* p = const_cast<char*>(p)。reinterpret_cast用于重新解释位模式,如char* pc = reinterpret_cast<char*>(ip)。

    第五章 语句

    try语句块和异常声明

    try语句块用于异常处理,throw表达式用于抛出异常。例子:

    if (item1.isbn() != item2.isbn())    throw runtime_error("Data must refer to same ISBN");cout << item1 + item2 << endl;

    try语句块后面跟着catch子句,处理抛出的异常。try块内的变量无法在catch子句中访问。

    异常传播

    异常从当前函数传播到调用者,直到找到匹配的catch子句。如果无匹配,调用terminate函数终止程序。

    标准异常

    stdexcept头文件定义了多种异常类,如runtime_error、out_of_range等。异常对象通过what()方法返回描述信息。

    总结

    本章涵盖了C++语言中的左值和右值、赋值运算符、类型转换以及异常处理。理解这些概念对于编写高效且健壮的C++程序至关重要。

    转载地址:http://eyhwz.baihongyu.com/

    你可能感兴趣的文章
    Python函数合集:足足68个内置函数请收好!
    查看>>
    Python+Selenium自动化测试项目实战
    查看>>
    Python+Selenium自动化测试项目实战【建议收藏】
    查看>>
    Python+Selenium自动化测试:Page Object模式
    查看>>
    python+selenium进行cnblog的自动化登录测试
    查看>>
    Python函数只返回第一个值而不是数据框
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(上)
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(下)
    查看>>
    PYTHON+Twisted+sqlanydb=ABORT()
    查看>>
    Python函数之返回值、作用域和局部变量
    查看>>
    Python+统计学 | 探索常用的数据分析统计分布
    查看>>
    python, selenium中用于切换帧的函数
    查看>>
    python函数
    查看>>
    python----线程、进程、协程的区别及多线程详解
    查看>>
    python---5
    查看>>
    python---使用celery分布式系统异步发送短信(云通讯)来验证登录
    查看>>
    python--003--百分号字符串拼接、format
    查看>>
    Python--10、线程
    查看>>
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>