cs50
make 命令编译时不用后缀,会自动编译
(第四集 47:34)在terminal运行程序时,当程序陷入错误,推出只需,ctrl+c即可.
在第四集54分钟左右,一位同学提出了一个问题,可以让百分比一直停在那个位置么?我觉得应该时大卫误解了这个问题,他回答的是对齐的问题。这里思考一下原地增加的方法?
发现原来大卫也考虑到这个问题,在后来的几分钟,用/r解决了这个问题。
第五集:
由于数据转换错误导致的溢出引起爆炸。flight501事件
数据的非精确计算导致0.88+0.01<0.89
第六集
局部变量和全局变量用同一个x表示,那么在含有函数的局部变量操作时,操作的是局部变量
第七集
信息加密的安全性
第八集
冒泡排序 最坏n^2步; 选择排序 (n+1)n/2步;
第九集
归并排序,时间复杂度为(n*log(n))!
第十集
大卫从给老奶奶买票的经历说起,讲了设计不仅是要作对,还要从用户的的角度去考虑做好。这是设计者需要考虑的问题。所以设计的第一版要关注反馈。
内存中的地址地址0即 0x00000000是专用的,只有操作系统 才能控制即,可表示为NULL
两个分配内存的方法 new 和 malloc 其区别在这儿https://www.cnblogs.com/QG-whz/p/5140930.html
内存泄漏的一个情况, int *a; a = malloc(sizeof(int)); a=5;这样的话刚才给a分配的内存就再也找不到了,这就是内存泄漏。
段错误出现的一种情况,如果我int *b; *b=12; 有可能会出现段错误,因为如果不主动给b分配内存,那么里面可能是个任意值(任意地址),如果在这个任意地址上面写个数,如果这个地址不是系统分配给我的,那么就出现段错误。
第十一集
缓冲区溢出和缓冲区漏洞攻击。增加一些if判断条件以免使程序崩溃或者受到攻击。
《c++ Prime Plus》(中文第六版)
1.endl确保程序继续运行前刷新输出(将其立即显示在屏幕上);而”/n”不能提供这样的保证
2.区分函数原型和函数定义
3.const声明常量比#define 更好,因为其可以指定类型。
4.数组越界访问。 编译器不会检查数组下标是否有效,比如 int month[12]; month[13]=2; cout<< month[13]; 编译时不会出错,但运行时会提示 “stack smashing detected”。即数组越界。
5.采用char name[20]; cin>>name;接收字符串,只能接收到空格前的第一个单词。如果程序中连续接收两次输入:
“char name1[30];
char name2[30]
cin >> name1;
cout << name1;
cin >> name2;
cout << name2;”如果输入那name1 为li ming那么程序不会等name2输入,而是直接把ming 给name2, –参见《c++ Prime Plus》(中文第六版)p77.
6.访问类成员(如cin.getline())的方式是从访问结构成员变量的方式衍生出来的
7.结构中的位字段,c++允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。 –p94
8.int ptr; 和 int ptr;没有区别;但是int* p1,p2;声明的是一个指针p1和一个int 型变量p2。 声明指针时,每一个指针前面必须有一个。 –p100
9.一定要在对指针应用运算符前,将指针初始化为一个确定的,适当的地址。 例如 int fellow; *fellow =3; 这里系统会给指针分配一个内存,但时并没有给3的地址初始化,即没有初始化fellow,这就有可能发生危险。fellow可能为任意值。
10.一定要配对地使用new和delete;否则将发生内存泄漏(memory leak),即被分配的内存再也不能用了。如果发生内存泄漏,则程序将有序不断寻找更多内存而终止。另外,不能用delete释放声明变量所获得的内存,只能释放new分配的内存。–p104
11.将整数+1,其值增加1.但将指针变量+1后,增加的量等于它指向类型的字节数。
12.对数组啊int a[20];数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。
13.在编译时给数组分配内存称为静态联编,在程序运行时选择数组的长度,称为动态联编。
14.自动存储、静态存储和动态存储。 堆栈和内存泄漏。 –P117
15.逗号运算符 –P138
16.读取文件和键盘 –P155
17.ctype库函数,使用isalpha()来检查字符是否为字母字符,使用isdigitals()来测试字符是否为数字字符。。。。 P177
18.cin方法输入错误时返回false, 例如 用int n; while(cin >> n){}时输入为非int型数据时将跳出循环。
19.arr[i] == *(arr+i); &aarr[i] == arr + 1; 数组名和指针的关系。
20.函数的地址是存储其机器语言代码的内存的开始地址。
21.在链接编译模块时,请确保所有对象文件或库都是由同一个编译器生成的。如果有源代码,通常可以用自己的编译器重新编译源代码来消除链接错误。
22.作用域解析运算符::, using 声明使一个名称可用,而using编译指令将使所有的名称都可用。
23.无法使用对象来调用构造函数,因为构造函数在构造出对象之前,对象是不存在的。因此构造函数都用来构造对象,而不能被对象调用。 –P354
24.内联函数,其定义位于类声明中的函数都将自动成为内联函数,inline限定符可以在类声明定义之外定义成员函数–P347
25.函数重载和多态指的是同一回事,都是指可以同时有多个同一名称的函数。 –P276
26.程序清单10.6讨论了用两种方式初始化类的方法的不同,一种直接利用构造函数创建,而采用赋值的方式是先创建一个临时对象,再进行赋值 , –P361 P404创建shove对象时又强调了这一特性。
27.通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标不同。 – P362
28.引用,C++中int & rodents = rats ,&是类型标识符,就像生命中char指的是指向char的指针一样,int&指的是指向int的引用。
29.删除对象可以释放对象本身占用的内存,但并不能自动释放属于对象成员的指针指向的内存。因此,必须使用析构函数。在析构函数中使用delete语句可确保对象过期时,由构造函数使用new分配的内存释放。 –P429
30.警告:如果类中包含了使用new初始化的指针成员,应定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。–P436
31.C++包含让程序员能够限制程序结构的特性-使用explicit防止单参数构造函数的隐式转换,使用const限制方法修改数据,等等。这样做的根本原因是:在编译阶段出现错误优于在运行阶段出现错误。 –P538