《探索现代化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 领域驱动设计
如何更好地表达抽象概念。
在软件中全面有效的表示抽象概念。
简明直观的接口
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!