my c++ .. yuiwong.org .. c++
- my (yuiwong.org) c++ basics 02
- previous see https://yuiwong.org/2016/11/16/cpp/
#
tips
c++ !!!
- 封装
- 继承
- polymorphism 多态
polymorphism 多态
- 多态: 是对于不同对象接收相同消息时产生不同的动作.
- c++ 的多态性具体体现在运行和编译两个方面:
- 在程序运行时的多态性通过继承和虚函数来体现
- 在程序编译时多态性体现在函数和运算符的重载上
- c impl. 封装:
struct
-
c impl. 继承:
container_of
/**
* @brief YUIWONGORGPOSIX_CONTAINER_OF / YUIWONGORGPOSIX_DOWNCAST (container_of) (c)
* @description 结构体: 通过成员地址找到首地址 / downcast parent to sub
* @param
* - `type':
* 首地址 - 类型
* Or. downcast - "subtype" "子类"类型
* - `memptr'
* 首地址 - 成员地址
* Or. donwcast - parptr: 子类的"父类"成员(组合)的地址
* - `mem'
* 首地址 - mem 成员名
* Or. downcast - "父类作为子类的成员"(组合)的名字
*/
#define YUIWONGORGPOSIX_CONTAINER_OF(type, memptr, mem) \
((type *)((unsigned long)(memptr) \
- (unsigned long)&((type *)0)->mem))
#define YUIWONGORGPOSIX_DOWNCAST YUIWONGORGPOSIX_CONTAINER_OF
- c impl. 多态: 函数指针
sort
- 冒泡排序
- 快速排序
- 选择排序
see TODO
size
- size of empty class: 1
- size of empty struct: 1
- note: sizeof(double): 8
- sizeof addr type <=> size of size type
- sizeof win
x86_64
long: 4 but addr type is 8. other same to addr type - see https://yuiwong.org/gitweball/?p=cpp-basics.git;a=tree
misc
- stl std::map 实现: 红黑树
- stl std::vector 调整大小
- iterator / iterator 模式
- 提供一种方法顺序访问一个聚合对象中各个元素 而又不需暴露该对象的内部表示
- see https://yuiwong.org/gitweball/?p=cpp-basics.git;a=tree
- iterators
- template TODO
typename
andclassname
TODOtypedef
TODOtypealias
TODO-
空值类型: void
-
sometype *restrict someptr
—restrict
:
所有修改该指针所指向内存中内容的操作都必须通过该指针或者直接来自该指针的值
(例如 pointer + 1)
* gcc clang .. c++: `__restrict__`
* vc++ .. c++: `__restrict` and `__declspec(restrict)`
* c99 `memcpy`:
`void * memcpy(void *restrict dest, const void *restrict src, size_t n);`
`restrict` => let `memcpy()` 可以假定两个内存区域没有重叠.
=> 使用 `memcpy()` 时, 您必须确保没有重叠区域. 这是程序员的任务的一部分.
* see <https://yuiwong.org/gitweball/?p=cpp-basics.git;a=tree>
memcpy
andmemmove
memcpy
: 不能重叠memmove
: 先复制到临时缓冲- see https://yuiwong.org/gitweball/?p=cpp-basics.git;a=tree
__attribute__
(GNU),__declspec
(ms) and#pragma
: 编译器工具到语言的扩展- Attributes 属性
C++11 provides a standardized syntax for compiler/tool extensions
to the language.
Such extensions were traditionally specified using#pragma
directive
or vendor-specific keywords (like__attribute__
for GNU
and__declspec
for Microsoft). - see https://yuiwong.org/gitweball/?p=cpp-basics.git;a=tree
- Attributes 属性
explicit
(显式)explicit
是避免构造函数的参数自动转换为类对象的标识符
=> 必须要显示地调用构造函数
=> 即类似看到效果: 避免了创建临时对象
(实际并没有看到调用两次 ctor 而是避免了自动转换)- see https://yuiwong.org/gitweball/?p=cpp-basics.git;a=tree
union
TODOassign operator
: 注意: 需要判断是否是本身 特别不是通过构造函数实现时stream operator
TODOcast operator
TODO-
subscript 即 [] operator
- std::map: 没有 idx 下标操作, 有 key 下标操作
- std::list 无下标操作
- std::set 无下标操作
- c++ struct 可以有构造函数、普通函数 访问修饰 继承等 像 class 一样
- static var 会初始化 (包括作用域内)
c++ advanced
- 智能指针
- see TODO
-
设计模式
- see TODO
- 虚函数 虚函数表 虚函数表地址 and 运行时多态 TODO
- 虚析构函数 TODO
- 子类析构父类析构 TODO
container
TODO-
collection
TODO -
stl c++11 and above multi-threading
<atomic>
atomic (header)<thread>
thread (header)<mutex>
mutex (header)<condition_variable>
condition variable (header)<future>
future (header)- see TODO
optional
,nullopt_t
,nullopt
TODOnullptr_t
,nullptr
TODOany
TODOvar..
TODO-
forward
TODO -
typeid
(header<typeinfo>
) 用于类型检查 => rtti- example
const std::type_info& ti1 = typeid(A); const std::type_info& ti2 = typeid(A); assert(&ti1 == &ti2); /* not guaranteed */ assert(ti1.hash_code() == ti2.hash_code()); /* guaranteed */ assert(std::type_index(ti1) == std::type_index(ti2)); /* guaranteed */
- see TODO
- cast
- 隐式转换
- 显式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
cast_operator
转换操作符 (e.x. std::nullptr)
- some more casts
- downcast: downcast parent to sub(child)
- upcast: upcast sub(child) to parent
- sidecase: cast to 兄弟类
- see TODO