Simple Classes / Custom Types
Customs Types是个什么东西,不好理解,大概可以看做是一个simple classes,一个类。
Type Categories (simplified)
- 基础类型 void,bool,char,int,double
- 简单聚合 - struct(应该指的是c语言中那种struct聚合)
- 自定义类型 -类
Why Custom Types?
翻译一下,这个问题就是为什么要引入c++ 类和对象的概念,而不用c里的简单聚合类型?这个问题好大,不好回答,关乎c++的设计思路。有几个keywords。
- Correctness Guarantees 保证正确性
1.invariants = behavior and/or data properties that never change
??不变的行为和数据属性,好难理解...
2.avoid data corruption by controlling/restricting access to data members
通过对数据成员访问的限制防止数据冲突 - Reusable Abstractions 可重用的抽象模型
1.通过易用的接口隐藏低层次的实现细节
2.接口稳定,不收低层次的实现细节的影响
3.可以对常用设施做一个可重用的抽象 - Resource Management 易于资源管理 RAII
1.当对象constructed时获取对应资源
2.当对象destroyed时释放相应资源
Restricted Member Access 有限制的成员访问
- Member Functions 成员函数
1.私有成员只能通过成员函数访问
2.struct与class主要区别在于默认可见性 - public vs. private Visibility 可见性
const Member Functions 常成员函数
1.const对象只能调用const-qualified的成员函数
2.使用const(reference)作为参数的函数不能在内部对其修改
3.// write access to a 'node' node& **at**(int x) { … } // read-only access to a 'node' node const& **at**(int x) const { … }
- Member Declaration vs. Definition 成员声明和定义
1.复杂成员函数的定义通常放在类之外(并放在单独的源文件中)。
2.但是,小型成员函数(如接口适配器函数,getter(如count))应内联实现,即,直接在类主体中实现最大性能 Operator Member Functions 运算符成员函数
1.operator [] (int i) { … }
Initialization 初始化
其他的点不说了,说几个重要的点
- 显式构造函数↔隐式转换
Design, Conventions & Style 设计约定
...
Example Implementations 示例实现
...
Pointers
Why Pointer 为什么使用指针
1.观察对象(而且想在运行时改变指向,不能用引用)
2.想要获取一个动态生命周期的对象(声明周期不与某个变量或者某个scope绑定)
3.构造 Node-Based 的数据结构(Lists,Tree.Graphs)
Raw指针与Smart指针
- 原始指针
1.本质上是一个(unsigned) integer ,存储一块内存地址
2.多个raw P可指向一个addrrss/object std::unique_ptr<T>
1.指向objects on the heap
2.一个up一个对象
3.up和对象声明周期绑定
-std::shared_pointer<T>, std::weak_pointer<T>
1.指向objects on the heap
2.可以有多个sp/wp指向一个object
3.只要有一个share_ptr指向object。object就活着指针操作符
- & 取地址符 (用于类型定义时,定义一个引用)
- * 解引用符 (用于类型定义时,定义一个指针)
-> Member Access 成员访问符
const与指针
建议采用east const写法,从右往左读语义清晰
this pointer
this
返回对象本身的地址this->
可用于访问成员*this
访问对象本身能用引用的地方尽量避免指针
Destructors
Big 6 构造/析构/拷贝构造/拷贝赋值/移动构造/移动赋值
由编译器自动生成,在很多情况下不需要用户定义
RAII
C++使用值语义
- =(assignment)指向对象本身,并不仅仅是指针或引用
- 这是几乎所有编程语言中基本类型(int,double等)的默认行为,也是C ++中用户定义类型的默认行为
- 因此都是深拷贝,深赋值,深度所有权,深度可比较(operator ==,!=,<,<=...)
Exceptions 异常
f(){
...
throw std::invalid_argument("...");
}
try{
f();
}
catch(std::invalid_argument& e){
cerr << ...
}
Noexcept
使用noexcept 保证绝不允许抛出异常,如果抛出了,程序直接终止
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。