目录

C++概述

如何编写好的 C++程序

  1. 用代码直接表达想法

  2. 用代码直接表达想法之间的关联,如层次化 参数化 以及所属关系

  3. 无关的想法独立用代码表达

  4. 保持简单

  5. 尽量使用静态类型检查

  6. 保持信息的局部性 如 避免全局变量 尽量减少指针的使用

  7. 不要过分抽象化 没有明显的需求时 不要使用泛型 不要引入类层次 或是进行参数化

使用 C++11 的新特性来更新你的设计和编程技术

  1. 使用构造函数建立不等式

  2. 使用构造/析构函数来简化资源管理

  3. 避免裸 new 和 delete

  4. 使用容器和算法,而不是内置数组和专用代码

  5. 优先使用标准库特性,而非自己造轮子

  6. 使用异常,而非错误代码来报告不能局部处理的错误

  7. 使用移动语义来避免拷贝大对象

  8. 使用 unique_ptr 来引用多态类型的对象

  9. 使用 shared_ptr 来引用共享对象,即不只有一个所有者负责析构的对象

  10. 使用模板来保持静态类型安全,消除类型转换,并避免类层次的不必要使用

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

WX20190322-111108.png

异常

为了保证检测到的错误不会被遗漏,异常处理的基本思想是把错误检测(在被调函数中完成)和错误处理(在主调函数中完成)分离。

异常提供了一条可以把各种最好的错误处理方式组合在一起的途径。它的基本思想是:如果函数发现一个自己不能处理的错误,它不是正常返回,而是抛出异常来表示错误的发生。任何一个直接或间接的函数调用者都可以捕获这一异常,并确定应该如何处理。

自定义类型

类型的好处:

  • 表示:类型知道如何表示对象中的数据

  • 运算:类型知道如何对对象进行实名运算

运算符重载

你可以在类或枚举对象上定义几乎所有 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;
}