c++

my c++ .. yuiwong.org .. c++

my (yuiwong.org) c++ basics 01

#


tips

封装

  • 要像个对象, 不是有个 class 关键字就可以了
  • 视需要 少用 static

继承

  • 多用于实现接口
  • 可以用 组合 就不用继承

多态

  • root class, virtual dtor !!
  • 设计模式时多用

namespace

  • namespace required!
  • usually NO using
  • 可以简化相同前缀 / 前缀一样可以省略
  • 最好不要在名字前加前缀或缩写前缀 先考虑使用名字空间
  • enum 可以考虑: 名字空间 + Type

重载和默认参数

  • 重载最好只看参数个数, 默认参数时更要注意, 然后最好取和更合适的名字
e.x. c++ NULL is 0

设计模式

  • 视需要, 能用就用

模块复用和统一维护

  • 提取公共部分 先考虑封装成通用类和接口
  • 再者考虑封装成库和 git submodule

访问控制

  • 先考虑 private 和 friend class

引用

  • 参数: 第一个考虑可不可以使用 常引用

智能指针

  • 例如内存使用较大 先考虑使用堆并且使用智能指针自动回收
  • 注意 std::auto_ptrstd::unique_ptr (支持或不支持 C++11)

迭代器

  • erase all by iterator.

ref. TODO

e.x.
/* erase all (use iterator) */
#define ERASEALL(__0s, __0ittp, __0k, __0c) do { \
    __0ittp it = (__0s).begin(); \
    size_t fastforw = 0; \
    while (it != (__0s).end()) { \
        if ((__0k) == *(it)) { \
            ++(__0c); \
            (__0s).erase(it); \
            it = (__0s).begin() + fastforw; \
        } else { \
            ++fastforw; \
            ++it; \
        } \
    } \
} while(0)

stl

  • 非线程安全 => 可以再封装一下使可重入

const

  • 不修改就加 const, 并且考虑使用 { } 以立即释放
  • 也包括值类型作为参数 这样实现的函数内部就避免改错
  • cv: 尽量限制方法 const
  • 通常返回值不要加 const (包括返回对象)
  • 如有需要 使用 static_const 去掉 const 例如 const 方法内需要访问 mutex

cast

  • 使用 C++ 的 cast
static_cast
reinterpret_cast
const_cast
dynamic_cast

线程安全

  • 必须注意 头次实现就支持
  • 先考虑使用 scoped_lock 不支持 C++11 see TODO
  • 注意线程内使用回调时要避免可能出现的死锁

struct

  • 视需要 尽量使用构造函数以及重载操作符 初始化等使用

返回值

  • 最好不要返回 bool

assert

  • 测试 单元测试时必须要用

throw try catch

  • 返回引用考虑 throw
  • 测试 单元测试时必须要用

comments

  • 一定要有
  • 尽量不使用 // (太懒太难看)

inline

  • 最好不使用

see also