1、因为常量在定义后就不能修改,所以定义时必须初始化;

在全局作用域声明的const变量是定义该对象的文件中局部变量。也就是说该变量只存在你定义他的文件中,不能被其他文件访问。当然如果我们在其前面加上extern这个关键字的话,外部文件就能访问它了。

对于非const变量默认为extern,而const变量必须显式的指定它为extern

2、typedef通常被用于以下三种目的:

为了隐藏特定类型的实现,强调使用类型的目的;

简化复杂的类型定义,使其更容易理解;

允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。

3、enum:不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也不用于常要常量表达式的任何地方。

4、定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过构造函数的特殊成员函数控制初始化。

5string 类型的输入操作符对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该

空白字符仍留在输入流中)。

getline 函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到

换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string

对象中)。

当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。

 

 

5、vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。Vector类型的每一种都指定了其保存元素的类型。因此,vector<int>vector<string>都是数据类型。

对于下标操作符[]的使用有一点非常重要,就是仅能够提取确实已存在的元素。

Vector<int> inec; cout << ivec[0];这是错误的。

 

6、迭代器:iterator

所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。

Vector<int>::iterator iter;

End操作返回的迭代器指向vector的“末端元素的下一个”.

每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值。使用const_iterator类型时,我们可以得到一个迭代吕,它自身的值可以改变,但不能用来改变其所指向的元素的值。

7、标准库bitset:   #include<bitset>

bitset类似vector

8、指针与引用的比较:

区别:引用总是指向某个对象(事实上,引用就是该对象的别名),定义引用时没有初始化的错误的。其次,赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定的对象(这就是为什么引用必须在定义时初始化的原因)。给指针赋值修改的是指针对象本身,也就是使指针指向另一对象,指针在不同时刻可指向不同的对象。

9、指向const对象的指针:不允许用指针来改变其所指的const值,为了保证这个特性,C++语言强制要求指向const对象的指针也必须具有const特性;const double *cptr;

这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身,也就是说,cptr本身并不是const

不能使用void *指针保存const对象的地址,而必须使用const void * 类型的指针保存const对象的地址。

允许把非const对象的地址赋给指向const对象的指针:double dava = 3.14; cptr = &dval;

不能保证指向const的指针所指对象的值一定不可修改。

10、            const指针:

指针本身不能修改。Int errNumb = 0; int *const curErr = &errNumb;

11、            指向const对象的const指针:

 兼容上面二种特点:const double pi = 3.14; const double *const pi_ptr = &pi;

12、            typedef string *pstring; const pstring cstr;

等价于:string *const cstr; pstring const cstr;

13、            在使用处理C风格字符串的标准函数时,牢记字符串必须以结束符null结束。

char c[] = {'C','+','+','\0'};

       cout << strlen(c) << endl;如果我没有加’\0’,则计算结果是不可预料的。标准库函数strlen总是假定其参数字符串以null字符结束。当调用该标准库函数时,系统将会从实参c指向的内存空间开始一直搜索结束符,十到恰好遇到null为止。Strlen返回这一段内存空间中总共有多少个字符,无论如何这个数据不可能是正确的。

14、            动态的分配数组

int *pia = new int[10];new表达式分配一个含有10int型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针pia

int *pia = new int[10](),对数组元素做了初始化。在这里是初始化为0。如里前面加了个const则必须初始化,因为数组中每个元素都是const不能改变,不能赋值。

C++不允许定义长度为0的数组变量,但明确指出,调用new动态创建长度为0的数组是合法的。

15、            try块和异常处理,throw 表达式(引发了异常条件);try(处理异常)

16、            形参的初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名。

17、            可以将指向const对象的指针初始化为指向非const对象,但不可以让指向非const对象的指针指向const对象。

18、            应该将不需要修改的引用形参定义为const引用,普通的非const引用形参在使用时不太灵活。这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。

 

19、            通常,函数不应该有vector或其他标准库容器类型的形参。调用含有变通的非引用vector形参的函数将会复制vector的第一个元素。

 

20、            当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。

 

21、            函数返回:

函数返回非引用类型:函数的返回值用于初始化在调用函数处创建的临时对象。

返回引用:当函数返回引用类型时,没有复制返回值,相反,返回是对象本身。

千万不要返回局部对象的引用:当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

千万不要返回指向局部对象的指针:和上面的结果一样。

22、            编译器隐式地将在类内定义的成员函数当作内联函数;

23、            this指针:第个成员函数(static成员函数除外)都有一个额外的、隐含的形参this。在调用成员函数时,形参this初始化为调用函数的对象的地址

const在成员函数后面,我们叫这种函数为:常量成员函数。const成员函数不能修改调用该函数的对象。