C++概述

历史

cpp溯源:

history

C++在C的基础上,从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从Ada中继承到了模板和命名空间的概念,并且从Ada、Clu和ML继承到了异常处理。

参考书目

基础:

  • C++程序设计 第二版 钱能,清华大学出版社,2005, ISBN: 9787302114642
  • nC++ Primer 5th Edition, Stanley B.Lippman , Josee Lajoie , Barbara E.Moo , 2013 , ISBN: 9787121200380

效率:

  • Effective C++ : 50 Specific Ways to Improve Your Programs and Designs, Scott Meyers, Addison-Wesley, 1998, ISBN 0-201-92488-9
  • More Effective C++: 35 New Ways to Improve Your Programs and Designs, Scott Meyers, Addison-Wesley, ISBN 0-201-63371-X
  • Effective Modern C++:42 Specific Ways to Improve Your Use of C++11 and C++14 , Scott Meyers, Addison-Wesley, ISBN: 9781491903995

原理:

  • The Design and Evolution of C++, Bjarne Stroustrup, Addison-Wesley, 1994, ISBN 0-201-54330-3
  • The Annotated C++ Reference Manual, Margaret A.Eillis and Bjarne Stroustrup, Addison-Wesley, 1990, ISBN 0-201-51459-1
  • Programming – Principles and Practice Using C++,Bjarne Stroustrup,Addison-Wesley ISBN 978-0321-992789. May 2014.

语言、标准库:

  • The C++ Programming Language (4th Edition), Bjarne Stroustrup, Addison-Wesley, 2013, ISBN 978-0321563842
  • The C Programming Language, (2nd Edition), Brian W.Kernighan, Dennis M.Ritchie, 1988 by Prentice Hall, ISBN-13: 978-0-13-110362-7
  • The C++ Standard Library: A Tutorial and Reference, Nicolai M.Josuttis, ISBN: 9787121260896, 电子工业出版社, 2015
  • Modern C++ Design : Generic Programming and Design Patterns Applied, Andrei Alexandrescu,ISBN: 9787560929064, 华中科技大学出版社,2003

设计模式:

  • Design Patterns: Elements of Reusable Object-Oriented Software, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, Addison-Wesley, 1994, ISBN-13: 978-0201633610

结构化编程部分

数据类型

数据类型包括:

  • 基本数据类型
    • char 可以被signed、unsigned修饰
    • int 可以被全部四种修饰符long、short、signed、unsigned修饰
    • float 不能被修饰
    • double 只能用long修饰。
  • 构造类型
    • 布尔型
    • 枚举类型
    • 数组类型
    • 结构体类型
    • 联合体类型
    • 类类型
  • 指针类型
  • 引用类型
  • 空类型

每一种类型应该有固定的占用数据区空间大小,可以使用sizeof(<类型名>)得到该类型一个数据占用的字节数。

typedef可以为已有的类型定义一个别名。比如typedef int INT;

表达式

表达式主要由操作符和操作数组成。对表达式进行求值的时候,需要考虑到运算的优先级、结合性、类型转换、求值次序(从左到右还是从右到左,由编译器决定)。

由于通常只会定义同类型之间的运算,因此如果出现混合运算的时候需要进行类型转换。有时候是默认的类型转换,比如int到double;有时候需要强制类型转换。

不应该写入任何可能具有歧义的表达式,优化表达式的表示没有意义。

操作符可以重载,但是不能创建,只能给大多数已经存在的操作符重载。

赋值表达式

左值表达式=右值表达式

左值:具有存放数据的确定地址,注意有些表达式的计算结果是存在寄存器中的临时值,这种不是左值,比如(a+1)。左值可以是一个变量名、表达式或函数返回值。比如++a是左值,但是a++不是左值。对于返回引用的函数来说,函数返回值也可以是左值,比如int& foo(int[] a){return a[0]}这样的函数,可以写foo(a)=8这样的赋值表达式。

当一个表达式不是左值,它就是右值。除了数组、函数、不完整类型的所有左值都可以隐式转换为右值。取地址符&接受一个左值,返回一个右值;而解引用操作符*接受一个右值返回一个左值。另外,&还可以用来定义引用类型,准确的说是左值引用,因此,不能将一个右值赋值给(非常量的)左值引用。右值可以赋值给常量引用,但是不能修改,因为强调这是一个临时的值。常见的右值比如说一个字面常量,不返回左值引用的函数返回值。

左右两边类型不同时,先计算右值表达式的值,再转换为左值这边的类型,之后赋值。

算术表达式

比较特殊的就是增量和减量操作符。

  • ++a(–a) 前增量的结果是左值。
  • a++(a–) 后增量的结果是右值。

当然a也必须是左值,不然没办法让a自增。

条件运算符表达式

<exp1>?<exp2>:<exp3>先计算exp1的值,然后根据其结果选择2和3中的一个计算,整个表达式的值也是所选2或3表达式的值。2和3中只会有一个被计算。

条件三元运算符不能重载。

逗号表达式

从左到右依次计算,最后一个表达式的值作为整个表达式的值。如果最后一个表达式是左值,那么整个表达式是左值。

字位运算符表达式

把数据看成二进制数,对二进制的序列进行操作。

~取反,&与,|或,^异或。右移位>>,左移位<<。

语句

可分为表达式语句,IO语句,控制流语句。

控制流语句:所谓结构化程序设计就是用3种控制流结构来完成程序的流程:顺序、选择、循环。

Switch语句

switch后填入整型表达式,而case后需要填入整型常量表达式(需要编译时能确定的值),并且满足不重复。这里的值次序任意,起到标号的作用,并不改变执行的顺序,因此需要配合break语句使用。

实现:表驱动,建立一个case的索引表(case后面的值直接作为偏移量),计算switch目标的值之后直接查表,并执行后面记录的指令内容。是一种牺牲空间提高时间效率的做法。