C++再学习之路(二)

1. 移位操作符“ << ”和“ >> ”拥有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高

2. *iter++

  后自增操作的优先级高于解引用操作,因此 *iter++ 等效于 *(iter++),子表达式 iter++ 使iter加1,然后返回iter原值的副本作为该表达式的结果,因此解引用*的操作数是iter 未加1前的副本

3.  对数组做sizeof()操作等效于将其对元素类型做sizeof() 操作的结果乘上数组元素的个数

1 int sz = sizeof(ia) / sizeof(*ia);    // 因为sizeof()返回整个数组在内存中的存储长度,所以用sizeof数组的结果除以sizeof其元素类型的结果,即可求出数组元素类型的个数

4.  删除指针后,该指针变为悬垂指针(dangling pointer)。 悬垂指针指向曾经存放对象的内存,但该对象已经不存在了

  一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚地表明指针不再指向任何对象

5.  C++ 自动将枚举类型的对象或枚举成员转换为整型,其转换结果可用于任何要求使用整数值的地方

6. while 、switch 和 for 中定义的变量只能在其中使用

7. switch 语句

  如果表达式与其中一个case 标号的值匹配,则程序将从该标号后面的第一个语句开始依次执行每个语句,直到switch 结束或者遇到break 语句为止

8. 可以在for 语句的init-statement 中定义多个对象;但是该处只能出现一个语句,因此所有的对象必须具有相同的一般类型

9. 与while 语句不同,do while 语句总是以分号结束;变量如果定义在do 内部,则其作用域就只能在while前的花括号内;任何在循环条件中引用的变量都必须在do 语句之前就已经存在

10. 当break 出现在嵌套的switch 或者循环语句中时,将会终止里层的switch 或循环语句,而外层的 switch 或者循环不受影响

11.continue 语句导致最近的循环语句的当次迭代提前结束

12. throw 表达式

  中断当前执行路径的表达式。每个throw 都会抛出一个对象,并将控制转移到最近的可处理该类型异常的catch 子句

13. try 块

  跟在关键字try 后面的块,以及一个或多个catch 子句。如果try 块中的代码产生了异常,而且该异常类型与其中某一个catch 子句匹配,则执行这个catch 子句的语句处理这个异常。否则,异常将由外围try 块处理,或终止程序

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

15. 数组两个特殊的性质
  1) 不能复制数组
  2)使用数组名字时,数组名会自动转化为指向其第一个元素的指针

16. 函数应当在头文件中声明并在源文件中定义,定义函数的源文件中应包含声明该函数的头文件

17. 通常,应在函数声明中指定默认实参,并将该声明放在合适的头文件中;如果在函数定义的形参表中提供默认实参,那么只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的

18. 内联函数应该放在头文件中

19. 在类的定义外面定义成员函数必须指明它们是类的成员

20. 允许将形参定义为函数类型,但函数的返回类型必须是指向函数的指针,而不能是函数

21. IO对象不允许做复制或赋值操作

  1)流对象不能存储在 vector (或其他)容器中(即不存在存储流对象的 vector 或其它容器)

  2)形参或返回类型也不能为流类型,如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用

22. 需要读写文件时,则必须定义自己的对象,并将它们绑定在需要的文件上,为ifstream 或者 ofstream 对象提供文件名作为初始化式,就相当于打开了特定的文件

1 // construct an ifstream and bind it to  the file named ifile
2 ifstream infile(ifile.c_str());
3 // ofstream output file object to write file named ofile 
4 ofstream outfile(ofile.c_str());
5 
6 ifstream infile;           // unbound input file stream
7 ofstream outfile;          // unbound output file stream
8 infile.open("in");        // open file named "in" in the current directory
9 outfile.open("out");      // open file named "out" in the current directory

23. 如果程序员需要重用文件流读写多个文件,必须在读另一个文件之前调用 clear 清楚该流的状态

24. stringstream 读写字符串的流对象

  除了普通的 iostream 操作外,它还定义了名为  str 的重载成员。无实参地调用 str 将返回 stringdtream 所关联的string 值。用string 对象做实参调用它则将该 stringstream 对象与副本相关连

25. 泛型算法

  1) 这些算法可作用于各种不同的容器类型;

  2) 这些容器可以容纳多种不同类型的元素;

26. 容器适配器

  容器适配器是对容器的一种再封装。不同的容器适配器提供不同的函数,使容器的功能得到全新的特定的扩展。(但它和容器的容器是有区别的:容器适配器不支持迭代器和算法,使用起来限制比较大)。标准库提供了三种容器适配器:queue,stack 和 priority_queue,本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。例如, stack(栈) 适配器可使任何一种顺序容器以栈的方式工作。

 27. 所有的容器都是类模板

 28. 指针就是迭代器,通过使用内置数组中的一对指针初始化容器是可以的

 29.  const_iterator 元素的只读迭代器类型

 30. 容器元素都是副本

  在容器中添加元素时,系统是将元素值复制到容器里。

原文地址:https://www.cnblogs.com/zhp218/p/8576740.html