和我一起写矩阵类(一) - WAKU的专栏

来源:百度文库 编辑:神马文学网 时间:2024/04/30 05:10:52
大连理工大学软件学院WAKU(转载请保留署名)
最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类。我花了几天完成了,期间也增长了很多知识,不敢独享,拿出来和大家共同学习。由于本人水平很非常有限,有错误不要给我面子,请尽快指出,我将不胜感激!!
开始吧。
矩阵也是一种数据结构,所以在设计之前一定要明确有哪些数据和哪些操作。首先,最容易想到的,矩阵要有一个一个二维数组,好这简单:
double array[3][3];
先等一下,为什么是double类型的?为什么是3x3的二维数组,如果图省事,这么定义当然可以,而且在相当一部分场合中,这个矩阵类也很实用。
我们要有更高的追求,要想办法使我们的类寿命更长。改进它:
类型用模板,可以花最少的时间最大程度上的提高代码的重用性。
template 
那么二维数组应该几乘几的呢,答案是由用户确定。数组在矩阵使用的时候动态创建,可大可小,最具有灵活性。那么动态的二维数组应如何表示呢?大家都动态创建过一维数组,写过类似这样的语句:
int *p = new int[10];
new关键字动态的申请了10个int类型的连续空间,并把这段连续空间的首地址赋给指针p。然后就可以使用p[i]来引用数组元素,因为数组名就是指针。以此类推,动态二维数组也应该用指针来表示、来引用元素。在定义指针之前,还是回顾一下二维数组的一些概念,举例说明:
double array[3][3];
定义了3x3的double型数组,由于内存是线性的,所以这9个元素在内存中都是“一条直线”似的存放。array[0][0]是头一个元素,array[2][2]是最后一个元素,这很好理解。那么array[0]代表什么?它是什么东西?
它其实也是个指针,指向数组的第一行元素的行首。同理array[1]是第二行行首指针,array[2]是第三行。array呢?它是数组名,那肯定也是个指针,但是它可不是我们常用的那种指针,而是一个指向指针的指针(二级指针)。它指向的是“指向第一行行首的指针”。看着像一个绕口令,仔细琢磨一下就明白了。如果你感兴趣,输入以下代码并执行:
double array[3][3];
cout<<&array[0]<你会发现输出的值是完全相同的,这就证明了array指向了array[0]。总结一下就是:
想表示或引用几维数组,就需要几级指针。
那么我们的类属性的声明就差不多了:
template
class CMatrix
{
int m;     //行数
int n;     //列数
T** p;     //二维数组指针
};
由于是动态创建的数组,所以矩阵的行和列各需要用一个int型变量来记录。p就是用模板创建的二级指针,来表示二维数组。
下一次我们就开始类方法的设计。大家觉得我写的还可以,麻烦贵手轻抬回一下贴,让我知道有人在看,好有动力写下去,谢谢~~