cpp小特性荟萃

  1. 如果一个函数的参数列表是int &,那他不能直接接受一个int类型变量的计算 e.g. func(3 * i) 如果改成const int &就可以了,因为3 * i在编译器会变成const int类型,这下是const ref const就合法了image.png image.png (不得不说clion好牛逼,这个bug在vsc的errorlens是查不出来的,虽然报错形式是 No matching function,其意图仍然在找一个重载的函数能够接受const int &类型) (func应该是void,忘记改了)

    • 启示:在不设计修改的日志操作时,参数列表自动const 和 & 一块写上
  2. ++ii++ 等自增自减运算符在性能上有什么区别? 之前一直简单地觉得 i++++i 只有先后增的区别,实际并非如此

    • 前缀表达:先对变量进行增/减,返回的是变量本身(左值

    • 后缀形式:先调用拷贝构造函数拷贝一个副本,然后对变量本身进行自增/减,最后返回副本。 即:返回的临时副本是递增前,原本样本进行递增不返回 返回的是临时副本,是一个右值,随时都是一个 由于存在拷贝花销,在性能敏感的循环过程中使用 i++ 会重复拷贝构造对象,性能略逊一筹

      (虽然但是 刷力扣经常见到的是前缀表达,但我觉得 i++ 更美观啊!x)

    • 上一个区别左值右值经典例子即可区分

      1
      2
      3
      int i = 0;
      int &ref_1 = (++i); //合法
      int &ref_2 = (i++); //不合法,报错为:error: llvalue required as unary '&' operand