1、当const变量是常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式来替换对这些const变量的使用。所以,在实践中不会有任何存储空间用于存储常量表达式初始化的const变量。
2、字符串字面值和标准库string类型不是同一种类型,这一点很容易引起混乱。
3、vector必须是已经存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
4、非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数,言外之意是,你懂的。
对于到运行阶段才知道其值的const变量为:const unsigned sz = get_size();
5、在函数体外定义的数组,数组元素初始化为0。函数体内定义的数组,数组元素无初始化,访问时会出现异常。
6、vector使用vector::size_type作为下标类型,而数组下标的正确类型是size_t。
7、导致安全问题的最常见的错误是所谓的"缓冲区溢出(buffer overflow)"错误。当我们在编程的时候没有检查下标,并且引用了越出数组或其他类似数据结构边界的元素时,就会导致这样的错误。
8、左值与右值这两概念是从c中传承而来的,在c中,左值指的是能够出现在等号左边及右边的变量(表达式),右值则指的是只能出现在等号右边的变量(表达式).具体区别,以及C++中的详细用法及案例,点击this
9、避免使用未初始化的指针,很多运行时错误都源于使用了未初始化的指针。
10、C++提供了一种特殊的指针类型void *,它可以保存任何类型对象的地址:
double obj = 3.14;
double *pd = &obj;
void *pv = &obj;
pv = pd;//void *表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
11、指向指针的指针
int ival = 1024;int *pi = &ival;int **ppi = π//ppi--->pi--->ival
12、由标准库定义的类型转换。如:string s; while(cin >> s)
这里隐式使用了IO标准库定义的类型转换。while循环条件应为bool类型的值,但此时给出的却是istream类类型的值,于是istream类型的值应转换为bool类型。将istream类型转换为bool类型意味着要检验流的状态。如果最后一次读cin的尝试是成功的,则流的状态将导致上述类型转换为bool类型后获得true值--while循环条件成立。如果最后一次尝试失败,比如说已经读到了文件尾,此时将istream类型转换为bool类型后得false,while循环条件不成立。
13、显示转换:又称强制类型转换(cast),包括以下列名字命名的强制类型转换操作符:
satic_cast、 dynamic_cast、 const_cast、 reinterpret_cast.虽然有时候确实是需要强制类型转换,但是它们本质上是非常危险的。
14、选择容器的一些法则:
(a)如果程序要求随机访问元素,则应使用vector或deque容器。
(b)如果程序必须在容器的中间位置插入或删除元素,则应采取list容器
(c)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器
(d)如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将
元素读入到一个list容器,接着对此容器重新排序,使其适合随机访问,然后将排序后的list容器复制到
一个vector容器。
note:通常来说,除非找到选择使用其他容器的更好的理由,否则vector容器都是最佳选择!!
15、容器适配器的概念
标准库提供了三种顺序容器适配器:queue、priority_queue、和stack。适配器(adaptor)是标准库中
通用的概念,包括容器适配器、迭代适配器和函数适配器。本质上,适配器是使事物的行为类似于另一
事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现
。例如,stack(栈)适配器可使任何一种顺序容器以栈的方式工作。
16、适配器满足的约束
stack适配器所关联的基础容器可以使任意一种顺序容器类型。因此,stack栈可以建立在vector、list、或
者deque容器之上。而queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list
容器上,而不能建立在vector容器上。priority_queue适配器要求提供随机访问功能,因此可建立在vector
或deque容器上,但不能建立在list容器上。。