《探索现代化C++》泛读笔记摘要3
Chapter 1 C++ 基础
数组、指针、引用
C++11 nullptr
指针一定要进行初始化
1 2 | int * ip3 = nullptr;
int * ip4{};
|
旧的代码风格
1 2 | int * ip3 = 0 ;
int * ip4 = NULL;
|
三种策略减少指针相关的错误
- 使用标准库容器
- 在类中封装动态内存管理,思想就是RAII。
- 使用智能指针
指针有两个作用:
- 引用对象
- 管理动态内存
C++11 智能指针
unique_ptr
1 2 3 4 5 6 7 8 | int main()
{
unique_ptr<double> dp{new double};
* dp = 7 ;
...
cout<< "The value of *dp is " << * dp<<endl;
}
|
这种指针不能拷贝,但是可以转移
1 2 | unique_ptr<double> dp2{move(dp)}, dp3;
dp3 = move(dp2);
|
数组型
1 2 3 | unique_ptr<double[]> da(new double[ 3 ]);
for (unsigned i = 0 ;i< 3 ; + + i)
da[i] = i + 2 ;
|
shared_ptr
1 2 3 4 5 6 7 8 9 10 11 | shared_ptr<double> f()
{
shared_ptr<double> p1{new double};
shared_ptr<double> p2{new double},p3 = p1;
cout<< "p3.use_count() = " <<p3.use_count()<<endl;
}
int main()
{
shared_ptr<double> p = f();
cout<< "p.use_count() = " << p.use_count()<<endl;
}
|
Weak Pointer
解决shared_ptr的循环引用。
引用
建议以引用为返回值的函数只返回指针、引用和具有引用语义的对象,比如指向动态分配的数据、指向在函数调用前就存在的数据或指向静态数据。
数组容器
C++11允许使用初始化列表进行初始化,这简化了容器的初始化。
1 | std::vector< float > v = { 1 , 2 , 3 }, w = { 7 , 8 , 9 };
|
结构化的软件项目
避免命名冲突
注释
注释应该通俗易懂
预处理指令
Include guards
1 2 3 4 5 6 7 8 9 10 11 | / / Author: me
/ / License: Pay me $ 100 every time you read this
double sine(double x);
...
|
更简洁一点的,但是可能移植性不太好,依赖于编译器是否支持这个扩展。
1 2 3 4 5 6 7 8 | / / Author: me
/ / License: Pay me $ 100 every time you read this
double sine(double x);
...
|
条件编译
Chapter 2 类
2.1 程序的普遍意义,不涉及技术细节
使用正确的抽象,如果不存在这种抽象,那么为其实现一个。
domain-specific 特定领域
Domain-Driven Design 领域驱动设计
如何更好地表达抽象概念。
在软件中全面有效的表示抽象概念。
简明直观的接口
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课