C++概述
如何编写好的 C++程序
用代码直接表达想法
用代码直接表达想法之间的关联,如层次化 参数化 以及所属关系
无关的想法独立用代码表达
保持简单
尽量使用静态类型检查
保持信息的局部性 如 避免全局变量 尽量减少指针的使用
不要过分抽象化 没有明显的需求时 不要使用泛型 不要引入类层次 或是进行参数化
使用 C++11 的新特性来更新你的设计和编程技术
使用构造函数建立不等式
使用构造/析构函数来简化资源管理
避免裸 new 和 delete
使用容器和算法,而不是内置数组和专用代码
优先使用标准库特性,而非自己造轮子
使用异常,而非错误代码来报告不能局部处理的错误
使用移动语义来避免拷贝大对象
使用
unique_ptr
来引用多态类型的对象使用
shared_ptr
来引用共享对象,即不只有一个所有者负责析构的对象使用模板来保持静态类型安全,消除类型转换,并避免类层次的不必要使用
C++ 与 C
使用内联 inline 函数,代替了宏替换
使用 new 和 delete 代替了 malloc() 和 free(),作为动态内存管理!优点:new 自动计算要分配类型的大小,不使用 sizeof 运算符。它自动返回正确的指针类型,不用进行强制类型转换。可以使用 new 对分配的对象进行初始化。
函数重载,对于简化函数命名有作用!
对于确定不会被设置为 null 的变量,使用 引用 & 来代替 * !在任何情况下都不能使用指向空值的引用!如果在设计中不允许变量为空,那推荐使用引用!
STL : algorithm ,container,iterator +工具类
模板 : 解决了不需要根据不同参数类型,写重复代码的繁琐!
对于 c 语言的预处理,c++中引入了一些新的方法代替它们
c++ 与 java
C++ 和 java 相比,只有标准的容器和算法,它的标准里没有网络,GUI 以及应用框架这些内容,因此需要第三方的库来支持,如果你了解 MFC,你就用知道 qt 和 c++的关系其实 与 MFC 和 C++的关系一样,qt 有完整的应用框架,GUI,网络等内容。
C++语法
类型 : 类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算。如果一个名为 v 的变量的类型为 T,则称:v 是一个 T 类型的变量。
C++支持 4 种程序设计风格:过程式程序设计、数据抽象、面向对象程序设计、泛型程序设计。
过程式程序设计: 专注于设计恰当的数据结构。
数据抽象: 专注于接口的设计以及一般实现细节的隐藏和特殊的表示方式。
面向对象: 专注于类层次的设计、实现和使用。类层次提供了运行时多态和封装机制。
泛型程序设计: 专注于通用算法的设计、实现和使用。通用的含义是:一个算法可以设计成能处理多种类型,只要这些类型满足算法对其实参的要求即可。C++提供的特性是模板,提供了运行时参数多态。比如要对不同类型(整数 小数 字符 字符串 用户定义的类型)的数据进行排序,通常必须为每种类型创建一个排序函数,然而通过写一个泛型函数,就可以将其用于各种实际类型。
断言
static_assert( sizeof(int) >= 4, "sizeof int 小于4字节\n");
基本操作
<img src="https://i.loli.net/2019/03/22/5c945003b887d.png" style="zoom:80%;" />
安全的类型转换
bool 到 char
bool 到 int
char 到 int
char 到 double
int 到 double
不安全的类型转换
double 到 int
double 到 char
double 到 bool
int 到 char
int 到 bool
char 到 bool
表达式
常量
const double pi = 3.14159
异常
为了保证检测到的错误不会被遗漏,异常处理的基本思想是把错误检测(在被调函数中完成)和错误处理(在主调函数中完成)分离。
异常提供了一条可以把各种最好的错误处理方式组合在一起的途径。它的基本思想是:如果函数发现一个自己不能处理的错误,它不是正常返回,而是抛出异常来表示错误的发生。任何一个直接或间接的函数调用者都可以捕获这一异常,并确定应该如何处理。
自定义类型
类型的好处:
表示:类型知道如何表示对象中的数据
运算:类型知道如何对对象进行实名运算
运算符重载
你可以在类或枚举对象上定义几乎所有 C++运算符,这通常称为运算符重载。
重载运算符时,运算对象数目必须和原来一样。
一个重载的运算符必须作用于至少一个用户自定义类型的运算对象。
enum Month{ Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }
Month operator++( Month& m )
{
m = ( m == Dec ) ? Jan : Month( m + 1 );
return m;
}