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_ptr
和std::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
- 最好不使用