
cpp小特性荟萃
Tanpinsary-
如果一个函数的参数列表是
int &
,那他不能直接接受一个int
类型变量的计算 e.g.func(3 * i)
如果改成const int &
就可以了,因为3 * i
在编译器会变成const int
类型,这下是const ref const
就合法了(不得不说clion好牛逼,这个bug在vsc的errorlens是查不出来的,虽然报错形式是 No matching function,其意图仍然在找一个重载的函数能够接受
const int &
类型) (func应该是void
,忘记改了)- 启示:在不设计修改的日志操作时,参数列表自动const 和 & 一块写上
-
++i
和i++
等自增自减运算符在性能上有什么区别? 之前一直简单地觉得i++
和++i
只有先后增的区别,实际并非如此-
前缀表达:先对变量进行增/减,返回的是变量本身(左值)
-
后缀形式:先调用拷贝构造函数拷贝一个副本,然后对变量本身进行自增/减,最后返回副本。 即:返回的临时副本是递增前,原本样本进行递增不返回 返回的是临时副本,是一个右值,随时都是一个 由于存在拷贝花销,在性能敏感的循环过程中使用
i++
会重复拷贝构造对象,性能略逊一筹(虽然但是 刷力扣经常见到的是前缀表达,但我觉得
i++
更美观啊!x) -
上一个区别左值右值经典例子即可区分
1
2
3int i = 0;
int &ref_1 = (++i); //合法
int &ref_2 = (i++); //不合法,报错为:error: llvalue required as unary '&' operand
-