casyup.me@outlook.com

0%

other/some useful define

保留条件表达式的第一个值

// CE: condition expression, RETAIN: 保持
#define CE_RETAIN1(a, b) ((a) ? (a) : (b))

考虑一个情况, 当一个值有效时, 使用它, 否则使用另外一个数
如果直接写的话, 不太容易理解

(exp) ? (exp) : -1;

当exp非常长的时候(或许可以保存成变量, 但是某些情况下, 不知道该用什么名字
而自己比较常用变量名差不多用光了, 或者这只是个只用一次的值), 如

val = func(a) * i + 10 ? func(a) * i + 10 : -1;

而如果用宏定义的话就比较清晰了

val = CE_RETAIN1(func(a) * i + 10, -1);

PS: 但是如果的确出现表达式过长的情况, 可能考虑优化代码是最好的解决方案

直接面向结果的函数

void show() { setvisible(true); }    
void hide() { setvisible(false); }

使用show(), hide()的情况下, 一目了然, 而通过参数的话, 理解会稍麻烦一些

getInstance

getInstance多数情况下作为一个类的公有接口, 用于获得一个实例
普通的书写方案如下

class A{
    int i; // 不仅仅是数据, 也可能是一个类
public:
    int& getInstance() { return i; }
};

使用这种方式的情况会存在两个问题

  1. 即使我从不使用i, 也从未掉用过getInstance这个函数, 但依旧给i分配了空间
  2. i依旧能在其他接口中被访问

上述两种情况并不一定会造成影响, 但可以考虑排除这种隐藏问题

int& getInstance() {
    static int i;

    return i;
}

静态变量在未被访问过的情况下, 不会分配空间
并且只存在于当前作用域, 有良好的安全性