C++概述
历史
cpp溯源:
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目标的值之后直接查表,并执行后面记录的指令内容。是一种牺牲空间提高时间效率的做法。