cpp笔记
OOP
类
构造函数
默认构造函数只有当你没有定义构造函数的时候才会自动生成,一旦你一提供了构造函数, 那么你也应该提供默认的构造函数。
tips
- 如果所有的类成员都是public的,那么使用struct,否则使用class。
- 仿函数(重载 operate())使用struct。
拷贝控制
concepts
- 直接初始化:
- 拷贝初始化:一般使用等号的都是拷贝初始化。而且在下列场景也会有拷贝初始化
- 将一个对象作为实参传递给非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 标准库容器初始化或者调用insert或push时。
拷贝初始化是使用拷贝构造函数实现的。
拷贝构造函数
1 |
|
拷贝赋值运算符
移动构造函数
移动赋值运算符
析构函数
析构函数包含一个函数体和一个析构部分,首先执行函数体,接着就销毁所有的成员,成员 按初始化顺序的逆序销毁。 析构部分是隐式的.
不要在函数体中销毁成员, 因为这是析构部分的任务,有一个例外是指针成员,析构部分不
会对指针调用delete,所以你可能需要在析构函数体中delete。智能指针实际上是类,它有
析构函数,所以析构部分可以很好的处理他,在函数体中你不用操心。
调用析构函数的场景:
- 变量离开作用域被销毁
- 当一个对象被销毁时,其成员也会被销毁
- 容器被销毁或者调用erase,clear,之类的函数删除元素时,被删除的元素都会被析构
- 对指针进行delete,那么它指向的对象会被析构。
STL
Template
Code Style
命名规范
- 类型命名 (类,结构体,枚举)使用驼峰命名,每个单词首字母均大写, 不包含下划线
- 变量名 一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用
- 常量命名 驼峰命名,在前面加 k 前缀, eg:
kDaysInAWeek
. - 函数命名 常规函数使用驼峰命名,getter/setter函数必须和类成员名字匹配, 如果 类有一个
field_
的成员,那么getter和setter分别为:field()
和set_field
. - namespace用小写字母命名, 并基于项目名称和目录结构
杂七杂八
Mix C and C++
主要是通过 extern "C"
来实现,他主要是用来抑制C++的名称混淆(name mangle)的。
c调用C++的库:常规的做法时是提供一个wrapper,你应该在C++中提供一个头文件 (c_api.h),
这个头文件要严格按照C的语法编写,同时在需要C调用的函数前应该添加上extern "C"
, 因为这个头文件会同时被C编译器和C++编译器调用,所以需要如下的代 码:#ifdef __cplusplus #define EXTERN_C extern "C" #endif
有了头文件,你接着需要在一个C++文件中(eg:c_api.cpp)实现头文件中定义的这些函数。 注意实现时是否加上
extern "C"
是可选的。C++中调用C库: 你只需要通过
extern "C" void c_func()
来声明就好,接着你就可 以调用c_func
了。
Profile/Debug
gperftools
install
1
2sudo apt-get install google-perftools libgoogle-perftools-dev
go get github.com/google/pprofcpu profile
1
LD_PRELOAD=/usr/lib/libprofiler.so CPUPROFILE=cpu_profile ./prog
heap profile
1
LD_PRELOAD=/usr/lib/libtcmalloc.so HEAPPROFILE=heap_profile ./cbmc
visualization
1
pprof --gv cpu_profile cbmc
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!