《C++ Primer Plus》第四章学习笔记

28:编译器不会检查数组下标是否有效,编程者要确保数组不会越界。

 

29:只有在定义数组时才能使用初始化,以后就不能再用了。     //a[2] = {1,2};是错的

 

30:STL中数组的代替品——vector

 

31:处理字符串两种方式:C风格字符串,string类库

 

32:C风格字符串中,处理字符串的函数根据空字符的位置,而不是数组长度来进行处理。

 

33:字符串常量(使用双引号)不能与自字符常量(使用单引号)互换。         //”S”代表两个字符S和\0,且”S”表示的是字符串的内存地址。

 

34:Cin提供了一些面向行的类成员函数:getline()和get(),主要区别:第三个参数默认下,都读取一行,直到换行符。然后,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。(很有意思也很重要,P73页)

 

35:一个有趣的用法来跳过get()把换行符留在输入队列的情况:cin.get(name,size).get() , 因为cin.get(name,size)返回cin对象,随后再调用get()读取换行。同样:cin.getline(name1,size).getline(name2,size)…….

 

36:为什么要使用get()而不是getline():

        1、老式实现没有getline();

        2、get()输入更仔细。假设用get()将一行输入数组中,如何知道停止读取的原因是由于已经读取了整行,而不是由于数组已满?查看下一个输入字符,如果是换行符,说明已读取了整行;否则是因为满了,且该行中还有其它输入。

 

37:String类位于名称空间std中。

 

38:对于C风格字符串,程序员使用C语言库的函数来完成这些任务.头文件cstring提供这些函数,比如strcpy()。

 

39:Strncat()比strcat()更安全,它接受了第三个参数。

 

40:String I/O: 1、cin >> str   2、getline(cin,str) //友元函数

 

41:访问类成员函数的方式是从访问结构成员变量的方式衍生而来的。

 

42:共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。所有数据类型共享同一块内存。

 

43:Enum提供了另一种创建符号常量的方式,这种方式可以代替const。

 

44:对于枚举,只定义了赋值操作符。需要注意:1、枚举量的值可以设置;2、枚举的取值范围。

 

45:面向对象编程与传统的过程性编程的区别在于,OOP强调的是在运行阶段(而不是在编译阶段)进行决策。比如用new分配数组大小,而不用传统的方式。

 

46:在C++中,int*是一种复合类型,是指向int的指针。

 

47:指针的初始化很重要,否则可能会导致一些隐晦的bug。

 

48:可以通过int* p = (int*)(0x0012FF43) 直接把地址赋给指针变量。

 

49:Delete p; 这将释放p指向的内存,但不会删除指针p本身。

 

50:C++将数组名解释为地址,可以将数组名赋给指针变量。

 

51:指针变量加1后,增加的量等于它指向的类型的字节数。

 

52:C++把a[1]解释为*(a+1)。

 

53:数组名和指针名的区别:

         1、可以修改指针的值,而数组名是常量;

         2、对数组应用sizeof得到数组长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。

 

54:Strncpy的用法:

         char a[5];         

         strncpy(a,”abcdefgd”,4);

         a[4] = ‘\0’;

 

55:把new和delete放在不同的函数中也是可以的。

 

56:自动变量在程序执行到其所属的代码块(通常是函数定义)时产生,在离开改代码块时终止。静态变量在整个程序周期内都存在。

 

书中的错误:

P71中有句”strings.cpp”,而前一页的代码名称为”string.cpp”;

P75文字第二段第二行,“ ……中。”这里的句号改成逗号更合适;

P79 4.3.3第一行一个很明显错误;

P97第三行是不是应该把new后面的[]去掉。

 

posted on 2012-01-14 14:59  zyearn  阅读(157)  评论(0编辑  收藏  举报