1.endl是一个特殊值,称为操纵符(manipulator),将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer)。通过刷新缓冲区,用户可以立即看到写入到流中的输出。
2.作用域标示符(scope operator,::操作符)
3.std::cin>>v1;
std::cin>>v2;
输入操作的效果是从标准输入读取两个值,将第一个存放的v1中,第二个存放在v2中。
4.初始化是指在变量定义时就给定一个值。
5.错误的注释比没有注释更糟,因为它会误导后来者。
6.文件结束符:
不同的操作系统使用不同的值作为文件结束符。Windows系统下是Ctrl+Z。Unix,包括iOS,通常使用Ctrl+D。
7.C++是静态类型(statically typed)语言,在编译时执行类型检查。
8.表示整数、字符和布尔值的算数类型合称为整型(integral type)。
9.在有些情况下,使用unsigned类型比较明智,可以避免值越界导致结果为负数的可能性。
10.不可打印字符和特殊字符都用转义字符书写。
11.C++中所有的字符串字面值都由编译器自动在行尾加上一个空格。
12.字符串字面值的连接:
两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。这使得多行书写长字符串字面值变得简单:
std::cout<< “a multi-line ” “string literal “ “using concatenation” <<std::endl;
输出结果:a multi-line string literal using concatenation
连接不同类型的行为标准没有定义。
13.在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。
std:cou\
t << “Hi” << st\
d::endl;
等价于:std::cout << “Hi” <<std::endl;
注意:反斜线符号必须的该行的尾字符——不允许其后面有注释或空格。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有政策的缩进。
14.程序不应该依赖机器相关的行为。
15.标识符(identifier),可以由字母、数字和下划线组成。变量名必须以字母和下划线开头,并且区分大小写。
16.标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。
17.命名习惯最重要的是保持一致。
18.复制初始化:int ival = 1024;
直接初始化:int ival(1024);
初始化不是赋值。初始化指创建变量并给它赋予初始值,而赋值则是擦除对象的当前值并用新值代替。
19.在C++语言中,变量可以声明多次,但是只能定义一次,而且变量在使用之前必须定义或声明。
20.全局作用域
命名空间作用域
类作用域
局部作用域
语句作用域
21.局部变量的定义可以屏蔽(hide)全局变量。
22.通常把一个对象定义在它首次使用的地方是一个很好的办法。
23.const对象默认为文件的局部变量
在全局作用域声明的const变量是定位该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
通过指定const变量为extern,就可以在整个程序中访问const对象:
extern const int bufSize = 1024;
24.引用
引用必须用与该引用同类型的对象初始化:
int inval = 1024;
int &refVal = ival;
int &refVal2 = 10; // 错误:引用必须用对象初始化
引用 == 别名
因为引用只是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。
引用初始化后,只要该引用存在,它就保持绑定到初始化时所指向的对象。不可能将引用绑定到另一个对象。
初始化是指明引用指向哪一个对象的唯一方法。
25.const引用
const引用是指向const对象的引用。
cosnt int ival = 1024;
const int &refVal = ival;
int &ref2 = ival; // 错误:非const引用不能指向const对象
普通的引用绑定到const对象是不合法的。
const引用可以初始化不同类型的对象或者初始化右值,如字面值常量:
int i = 42;
const int &r = 42;
const int &r2 = r + i;
const引用是只读的。
26.typedef名字
typedef用来定义类型的同义词:
typedef double wages;
typedef通常被用于以下三种目的:
·为了隐藏特定类型的实现,强调使用类型的目的;
·简化复杂的类型定义,使其更易理解;
·允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
27.枚举
枚举的定义包括关键字enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员(enumerator)列表。
enum open_modes { input, output, append};
默认地,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1.
枚举成员是常量。用来初始化枚举成员的值必须是一个常量表达式(constant expression)。
枚举成员的值可以是不唯一的。
// point2d is 2, point2w is 3, point3d is 3, point3w is 4
enum Points { point2d = 2, point2w,
point3d = 3, point3w };
28.类定义以关键字class开始,其后是该类的名字标识符。类体位于花括号里面。花括号后面必须要跟一个分号。
29.头文件用于声明而不用于定义
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
头文件可以定义类、值在编译时就已知到的const对象和inline函数。
当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。
如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该const变量应该在一个源文件中定义并初始化。应该在头文件中为它天津extern声明,以使其能被多个文件共享。
30.头文件保护符
头文件保护符(header guard)用于避免在已经见到头文件的情况下重新处理该头文件的内容。预处理器变量:
#ifndef _SALESITEM_H_
#define _SALESITEM_H_
// 在此处定义Sales_item类和相关的方法
#endif
31.#include <iostream.h> 和 #include “hello.h”
尖括号(<>)包含的认为是标准头文件,编译器将会在预定义的位置集查找该头文件。引号(“”)包含的认为是非系统头文件,查找通常开始于源文件所在的路径。
32.string的size()方法返回值为string::size_type类型。不要把size的返回值赋给一个int变量。
size_type存储的string的长度是int所能存储的两倍。
size_type属于配套类型,配套类型与机器无关。
33.string类型通过下标操作符([ ])来访问string对象中的单个字符。
34.现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
32.数组
如果没有显式提供元素初值,则数组元素会像普通变量一样初始化
·在函数体外定义的基本类型数组,其元素均初始化为0;
·在函数体内定义的基本类型数组,其元素无初始化;
·不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则必须为该数组的元素提供显示初始化。
字符数组初始化:
char ch1[] = {‘C’ , ‘+’ , ‘+’};
char ch2[] = {‘C’ , ‘+’ , ‘+’ , ‘\0’};
char ch3[] = “C++”; // 注意:后面自动加入一个空字符(null)用于结束字符串,ch3 // 的实际维数为4
不允许数组直接复制和复制
数组下标的正确类型是size_t.
35.指针
与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
string str(“hello world”);
string *sp = &str;
指针可能的取值:①一个特定对象的地址
②指向某个对象后面的另一个对象
③0值
string *sp = NULL 等价于 string *sp = 0;
指针初始化:
对指针进行初始化或赋值只能使用以下四种类型的值:
(1)0值常量表达式
(2)类型匹配的对象的地址。必须保证类型匹配
(3)另一个对象之后的下一个地址
(4)同类型的另一个有效指针
void*指针
它可以保存任何类型对象的地址。
不允许使用void*指针操纵它所指向的对象。
*操作符(解引用操作符)将获取指针所指的对象。
如果对左操作数进行解引用,则修改的是指针所指对象的值;如果没有使用解引用操纵,则修改的是指针本身的值。
36.引用和指针的区别
37.指向const对象的指针
C++强制要求指向const对象的指针也必须具有const特性:
const double pi = 3.14;
const double *cptr = π
cptr本身并不是const,在定义时不需要对其进行初始化。如果需要的话,允许给cptr重新赋值,使其指向另一个对象。但不能通过cptr修改其所指对象的值。
不能用void*指针保存const对象的地址,而必须用const void*类型的指针保存const对象的地址。
允许把非const对象的地址赋给指向const对象的指针。
如果把指向const的指针理解为“自以为指向const的指针”,这可能会对理解有所帮助。
38.const指针
const指针——本身的值不能修改。
int errNumb = 0;
int *const curErr = &errNumb;
与其他const量一样,const指针的值不能修改,这件意味着不能使curErr指向其他对象。
与任何const量一样,const指针也必须在定义时初始化。
39.“=”赋值操作符具有右结合性
40.sizeof操作符
sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t。