分享
 
 
 

和我一起写矩阵类(二)

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

和我一起写矩阵类(二)

大连理工大学软件学院WAKU(转载请保留署名)类的方法(也可叫做成员函数)从构造函数开始,我写的一个构造函数是这样的:

template <class T>

CMatrix<T>::CMatrix(void)

{

m = 0; n = 0;

p = NULL;

}

由于使用了模板,所以在每个成员函数之前都要加上template <class T>,而且类名后一定要加上<T>,否则会编译出错。这是一个无参的构造函数,里面把行列值赋0,把数组的指针置为空,这是一个好习惯。除了安全带来的另一个好处是避免了定义对象数组时写出一长串的初始化表。

如果有可能定义类的对象数组,最好提供类的无参构造函数

然后再提供另外的成员函数完成有参构造函数所完成的功能。我写的一个有参构造函数是:

template <class T>

CMatrix<T>::CMatrix(int m, int n)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = 0;

}

}

this->m = m; this->n = n;

}

这是有参构造函数所完成的功能,无参构造函数由于不知道行列的具体值所以不能加入以上代码,所以我们必须要另写一个一模一样的函数“补充”这个功能:

template <class T>

void CMatrix<T>::SetMatrix(int m, int n)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = 0;

}

}

this->m = m; this->n = n;

}

这两段代码实现了动态创建m行n列二维数组的功能。p = new T*[m];语句和第一篇里创建一维数组的语句非常类似,这里申请了有m个T类型的指针数组(即数组里存放的全是指向T类型的指针),并把这个数组的首地址赋给了p。然后外层for循环遍历数组里的每一个指针,并用每个指针p[i]接收由new创建的n个T类型数组。

明白前面我讲过二维数组,这段代码也就很好理解,p[i]是一个行指针,p[0]相当于double array[3][3]里的array[0]、p[1]就相当于array[1];然后每个行指针又“管辖”着刚申请的n个元素。里层for循环把这一行的元素值初始为0。其实说穿了也很简单吧。

下面把析构函数完成,很简单,就是释放申请的空间:

template <class T>

CMatrix<T>::~CMatrix(void)

{

int i;

if (p)

{

for (i = 0; i < m; i++)

{

delete[] p[i];

}

delete[] p;

}

}

记住一点,有几个new就要有几个delete。另外注意一点,delete后面的[]一定不要落下,否则编译器并不会报错,你的内存却还照样泄漏。

矩阵里面有一个二维数组,那么一个可以把二维数组填充到到矩阵里的函数无疑是非常有用的。让我们实现它吧:

template <class T>

CMatrix<T>::CMatrix(int m, int n, T* array)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = array[i*n+j];

}

}

this->m = m; this->n = n;

}

这是一个构造函数,用于在创建对象时就用二维数组赋值,对应重载的SetMatrix函数如下:

template <class T>

void CMatrix<T>::SetMatrix(int m, int n, T* array)

{

int i, j;

if (p)

{

for (i = 0; i < this->m; i++)

{

delete[] p[i];

}

delete[] p;

}

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = array[i*n+j];

}

}

this->m = m; this->n = n;

}

由于调用SetMatrix函数时的对象有可能已经申请了空间,所以再数组赋值之前应该释放掉。

我们不是要传递二维数组吗?为什么第三个参数是T* array?这不是一个一级指针吗?不觉得赋值的时候用p[i][j] = array[i*n+j];这种语句很奇怪吗?请听下回分解

类的方法(也可叫做成员函数)从构造函数开始,我写的一个构造函数是这样的:

template <class T>

CMatrix<T>::CMatrix(void)

{

m = 0; n = 0;

p = NULL;

}

由于使用了模板,所以在每个成员函数之前都要加上template <class T>,而且类名后一定要加上<T>,否则会编译出错。这是一个无参的构造函数,里面把行列值赋0,把数组的指针置为空,这是一个好习惯。除了安全带来的另一个好处是避免了定义对象数组时写出一长串的初始化表。

如果有可能定义类的对象数组,最好提供类的无参构造函数

然后再提供另外的成员函数完成有参构造函数所完成的功能。我写的一个有参构造函数是:

template <class T>

CMatrix<T>::CMatrix(int m, int n)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = 0;

}

}

this->m = m; this->n = n;

}

这是有参构造函数所完成的功能,无参构造函数由于不知道行列的具体值所以不能加入以上代码,所以我们必须要另写一个一模一样的函数“补充”这个功能:

template <class T>

void CMatrix<T>::SetMatrix(int m, int n)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = 0;

}

}

this->m = m; this->n = n;

}

这两段代码实现了动态创建m行n列二维数组的功能。p = new T*[m];语句和第一篇里创建一维数组的语句非常类似,这里申请了有m个T类型的指针数组(即数组里存放的全是指向T类型的指针),并把这个数组的首地址赋给了p。然后外层for循环遍历数组里的每一个指针,并用每个指针p[i]接收由new创建的n个T类型数组。

明白前面我讲过二维数组,这段代码也就很好理解,p[i]是一个行指针,p[0]相当于double array[3][3]里的array[0]、p[1]就相当于array[1];然后每个行指针又“管辖”着刚申请的n个元素。里层for循环把这一行的元素值初始为0。其实说穿了也很简单吧。

下面把析构函数完成,很简单,就是释放申请的空间:

template <class T>

CMatrix<T>::~CMatrix(void)

{

int i;

if (p)

{

for (i = 0; i < m; i++)

{

delete[] p[i];

}

delete[] p;

}

}

记住一点,有几个new就要有几个delete。另外注意一点,delete后面的[]一定不要落下,否则编译器并不会报错,你的内存却还照样泄漏。

矩阵里面有一个二维数组,那么一个可以把二维数组填充到到矩阵里的函数无疑是非常有用的。让我们实现它吧:

template <class T>

CMatrix<T>::CMatrix(int m, int n, T* array)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = array[i*n+j];

}

}

this->m = m; this->n = n;

}

这是一个构造函数,用于在创建对象时就用二维数组赋值,对应重载的SetMatrix函数如下:

template <class T>

void CMatrix<T>::SetMatrix(int m, int n, T* array)

{

int i, j;

if (p)

{

for (i = 0; i < this->m; i++)

{

delete[] p[i];

}

delete[] p;

}

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = array[i*n+j];

}

}

this->m = m; this->n = n;

}

由于调用SetMatrix函数时的对象有可能已经申请了空间,所以再数组赋值之前应该释放掉。

我们不是要传递二维数组吗?为什么第三个参数是T* array?这不是一个一级指针吗?不觉得赋值的时候用p[i][j] = array[i*n+j];这种语句很奇怪吗?请听下回分解

类的方法(也可叫做成员函数)从构造函数开始,我写的一个构造函数是这样的:

template <class T>

CMatrix<T>::CMatrix(void)

{

m = 0; n = 0;

p = NULL;

}

由于使用了模板,所以在每个成员函数之前都要加上template <class T>,而且类名后一定要加上<T>,否则会编译出错。这是一个无参的构造函数,里面把行列值赋0,把数组的指针置为空,这是一个好习惯。除了安全带来的另一个好处是避免了定义对象数组时写出一长串的初始化表。

如果有可能定义类的对象数组,最好提供类的无参构造函数

然后再提供另外的成员函数完成有参构造函数所完成的功能。我写的一个有参构造函数是:

template <class T>

CMatrix<T>::CMatrix(int m, int n)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = 0;

}

}

this->m = m; this->n = n;

}

这是有参构造函数所完成的功能,无参构造函数由于不知道行列的具体值所以不能加入以上代码,所以我们必须要另写一个一模一样的函数“补充”这个功能:

template <class T>

void CMatrix<T>::SetMatrix(int m, int n)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = 0;

}

}

this->m = m; this->n = n;

}

这两段代码实现了动态创建m行n列二维数组的功能。p = new T*[m];语句和第一篇里创建一维数组的语句非常类似,这里申请了有m个T类型的指针数组(即数组里存放的全是指向T类型的指针),并把这个数组的首地址赋给了p。然后外层for循环遍历数组里的每一个指针,并用每个指针p[i]接收由new创建的n个T类型数组。

明白前面我讲过二维数组,这段代码也就很好理解,p[i]是一个行指针,p[0]相当于double array[3][3]里的array[0]、p[1]就相当于array[1];然后每个行指针又“管辖”着刚申请的n个元素。里层for循环把这一行的元素值初始为0。其实说穿了也很简单吧。

下面把析构函数完成,很简单,就是释放申请的空间:

template <class T>

CMatrix<T>::~CMatrix(void)

{

int i;

if (p)

{

for (i = 0; i < m; i++)

{

delete[] p[i];

}

delete[] p;

}

}

记住一点,有几个new就要有几个delete。另外注意一点,delete后面的[]一定不要落下,否则编译器并不会报错,你的内存却还照样泄漏。

矩阵里面有一个二维数组,那么一个可以把二维数组填充到到矩阵里的函数无疑是非常有用的。让我们实现它吧:

template <class T>

CMatrix<T>::CMatrix(int m, int n, T* array)

{

int i, j;

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = array[i*n+j];

}

}

this->m = m; this->n = n;

}

这是一个构造函数,用于在创建对象时就用二维数组赋值,对应重载的SetMatrix函数如下:

template <class T>

void CMatrix<T>::SetMatrix(int m, int n, T* array)

{

int i, j;

if (p)

{

for (i = 0; i < this->m; i++)

{

delete[] p[i];

}

delete[] p;

}

p = new T*[m];

for (i = 0; i < m; i++)

{

p[i] = new T[n];

for (j = 0; j < n; j++)

{

p[i][j] = array[i*n+j];

}

}

this->m = m; this->n = n;

}

由于调用SetMatrix函数时的对象有可能已经申请了空间,所以再数组赋值之前应该释放掉。

我们不是要传递二维数组吗?为什么第三个参数是T* array?这不是一个一级指针吗?不觉得赋值的时候用p[i][j] = array[i*n+j];这种语句很奇怪吗?请听下回分解

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有