本文主要总结下面的问题:
1.为什么这周的作业里面,创建数组的时候使用堆内存更好;
2.指针指向不同类型走的步数不同。
第一周作业内容如下,题目来自Boolan:
为Date类实现如下成员:
1. 构造器,可以初始化年、月、日。
2. 大于、小于、等于(> 、< 、==)操作符重载,进行日期比较。
3. print() 打印出类似 2015-10-1 这样的格式。
然后创建两个全局函数:
1. 第1个函数 CreatePoints生成10个随机的Date,并以数组形式返回;
2. 第2个函数 Sort 对第1个函数CreatePoints生成的结果,将其按照从小到大进行排序。
最后在main函数中调用CreatePoints,并调用print将结果打印出来。然后调用Sort函数对前面结果处理后,并再次调用print将结果打印出来。
创建数组的时候使用堆内存更好是因为可以根据程序的需要控制数组的生存周期。如果使用栈内存,数组离开了它被定义的作用域,就会被编译器删掉,这会导致后续使用这个数组的代码出错。使用堆内存的话需牢记delete。我把数组写到栈里面了,以后要注意。
另外,我的答案里CreatePoints的设计是有问题的。朋友的点播使我发现我对指针和数组的理解不够好,导致CreatePoints的返回类型不够准确。我写的arrTen不影响运行结果,只是不准确,在朋友指出来的这个问题我之前完全没有意识到(学得不精)。这个问题就是指针指向不同类型走的步数不同。我原来写的CreatePoints的返回类型如下:
using arrTen = Date[10];
arrTen* CreatePoints(Date(&arr)[10]);
题目中要求的是返回一个含有10个Date对象的数组,就是返回一个指向Date的指针,也就是:
Date* CreatePoints(Date(&arr)[10]);
返回Date*与返回arrTen*的形式的差别在于指针每次移动的步数不同,前者每次移动一个Date对象,后者每次移动10个Date对象。
可以用如下的程序说明:
#include<iostream> using std::cout; using std::ends; using std::endl; int main() { int a[][3] = { 0,1,2,3,4,5,6,7,8 }; int(*p)[3] = a; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << p[i][j] << ends; } } cout << endl; int *pN = (int*)a; for (int i = 0; i < 9; i++) { cout << pN[i] << ends; } cout << endl; system("pause"); return 0; }
运行结果:
二者都打印出了含有9个数字的数组,但p指向int[3], 循环3次;pN指向int,循环9次, 所以p每次走3个int, pN每次走1个int。