《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后面的[]去掉。