题目:用类定义的方法完成矩阵的加法和乘法
matrix.h文件
#pragma once
#ifndef MATRIX_H
#define MATRIX_H
class matrix
{
public:
int row;
int column;
int * matrixp;
matrix(void);
//matrix(const matrix &matrix1);
~matrix(void);
//matrix(matrix &matrix1,matrix &matrix2, const char &str);
void matrix_input(void);
void matrix_output(void);
void matrix_mul(matrix &matrix1, matrix &matrix2);
void matrix_plus(matrix &matrix1, matrix &matrix2);
};
#endif // MATRIX_H
matrix.cpp文件
#include "matrix.h"
#include <iostream>
using namespace std;
/***********************************************************
函数名称:void matrix::matrix_input(void)
函数类型:类成员函数
函数功能:矩阵的行列以及元素的输入
函数形参:无
函数返回值:无
***********************************************************/
void matrix::matrix_input(void)
{
cout << "please input the row and column:" << endl;
cin >> row >> column;
matrixp = new int[row*column];
cout << "please input the matrix:" << endl;
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
cin >> matrixp[i*column + j];
}
}
}
/***********************************************************
函数名称:void matrix::matrix_output(void)
函数类型:类成员函数
函数功能:矩阵的元素的输出
函数形参:无
函数返回值:无
***********************************************************/
void matrix::matrix_output(void)
{
cout << " the matrix is:" << endl;
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
cout << matrixp[i*column + j] << ' ';
}
cout << endl;
}
}
/***********************************************************
函数名称:matrix::matrix()
函数类型:构造函数
函数功能:矩阵的行列以及元素的输入
函数形参:无
函数返回值:无
***********************************************************/
matrix::matrix()
{
matrix_input();
}
/***********************************************************
函数名称:matrix::matrix(const matrix &matrix1)
函数类型:拷贝构造函数
函数功能:复制矩阵,深拷贝
函数形参:matrix类型矩阵
函数返回值:无
***********************************************************/
/*matrix::matrix(const matrix &matrix1)
{
row = matrix1.row;
column = matrix1.column;
matrixp = new int[row*column];
cout << "深拷贝" << endl;
for (int i = 0;i < row;i++)
{
for (int j = 0;j < column;j++)
{
matrixp[i*column + j] = matrix1.matrixp[i*column + j];
}
}
}
*/
/***********************************************************
函数名称:matrix::~matrix()
函数类型:析构函数
函数功能:内存释放
函数形参:无
函数返回值:无
***********************************************************/
matrix::~matrix()
{
delete[]matrixp;
}
/***********************************************************
matrix::matrix(matrix &matrix1, matrix &matrix2, const char &str)
函数类型:拷贝构造函数
函数功能:完成矩阵乘法和加法的运算
函数形参:matrix类型的矩阵matrix1和matrix2,char类型的操作符
函数返回值:无
***********************************************************/
/*matrix::matrix(matrix &matrix1, matrix &matrix2, const char &str)
{
if (str == '*')
{
if (matrix2.row != matrix1.column)
{
cout << "matrix2.row != matrix1.column" << endl;
exit(0);
}
row = matrix1.row;
column = matrix2.column;
matrixp = new int[row*column];
matrix_mul(matrix1, matrix2);
}
else if (str == '+')
{
if (matrix1.row != matrix2.row || matrix1.column != matrix2.column)
{
cout << "matrix1.row != matrix2.row OR matrix1.column != matrix2.column" << endl;
exit(0);
}
row = matrix1.row;
column = matrix1.column;
matrixp = new int[row*column];
matrix_plus(matrix1, matrix2);
}
}
*/
/***********************************************************
matrix::matrix_plus(matrix &matrix1, matrix &matrix2)
函数类型:类成员函数
函数功能:完成加法的运算
函数形参:matrix类型的矩阵matrix1和matrix2
函数返回值:无
***********************************************************/
void matrix::matrix_plus(matrix &matrix1, matrix &matrix2)
{
for (int i = 0; i<matrix1.row; i++)
{
for (int j = 0; j<matrix1.column; j++)
{
matrixp[i*column + j] = matrix1.matrixp[i*column + j] + matrix2.matrixp[i*column + j];
}
}
}
/***********************************************************
matrix::matrix_plus(matrix &matrix1, matrix &matrix2)
函数类型:类成员函数
函数功能:完成乘法的运算
函数形参:matrix类型的矩阵matrix1和matrix2
函数返回值:无
***********************************************************/
void matrix::matrix_mul(matrix &matrix1, matrix &matrix2)
//将此部分改为引用,无需定义拷贝构造函数???
//void matrix::matrix_mul(matrix matrix1, matrix matrix2)
//此函数需要将实参值拷贝给形参,只调用调用拷贝构造函数,不调用一般的构造函数
{
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
int sum = 0;
for (int k = 0; k<matrix1.column; k++)
{
sum += matrix1.matrixp[i*matrix1.column + k] * matrix2.matrixp[k*column + j];
}
matrixp[i*column + j] = sum;
}
}
}
main.cpp文件
#include<iostream>
#include "matrix.h"
using namespace std;
int main()
{
matrix matrix1, matrix2, matrix3;
//matrix matrix3 = matrix(matrix1, matrix2,'*');
matrix3.matrix_mul(matrix1, matrix2);
matrix3.matrix_output();
getchar();
}
类定义中有指针成员时:
若存在某个函数将类类型的实参传递给函数形参时,必须有拷贝构造函数。
形式为:
matrix::matrix(matrix &matrix1)
{
将matrix1成员的值赋给matrix对象
重新分配matrixp指针空间
将matrix1.matrixp存放的数值复制到类对象的matrixp空间中
}
若不存在任何函数将类类型的实参传递给函数形参时,无需拷贝构造函数。
例如上例中,所有的函数的参数传递使用引用的方式,因此无需构造拷贝构造函数
void matrix::matrix_mul(matrix &matrix1, matrix &matrix2) //引用的方式,没有实参形参传递,无需拷贝构造函数
void matrix::matrix_mul(matrix matrix1, matrix matrix2) //引用的方式,没有实参形参传递,需要拷贝构造函数
matrix(const matrix &matrix1); //引用方式下,需自定义拷贝构造函数
另外,对象的定义也可以使用拷贝构造函数
matrix matrix3 = matrix(matrix1, matrix2,'*'); //构造matrix类型的matrix3
matrix matrix4 = matrix(matrix1); //构造matrix类型的matrix4等于matrix1
即格式为:
matrix matrixn = 拷贝构造函数(参数)
因此此题用函数实参形参传递方式如下:
matrix.h
#pragma once
#ifndef MATRIX_H
#define MATRIX_H
class matrix
{
public:
int row;
int column;
int * matrixp;
matrix(void);
matrix(const matrix &matrix1);
~matrix(void);
matrix(matrix &matrix1,matrix &matrix2, const char &str);
void matrix_input(void);
void matrix_output(void);
void matrix_mul(matrix matrix1, matrix matrix2);
void matrix_plus(matrix matrix1, matrix matrix2);
};
#endif // MATRIX_H
matrix.cpp文件
#include "matrix.h"
#include <iostream>
using namespace std;
/***********************************************************
函数名称:void matrix::matrix_input(void)
函数类型:类成员函数
函数功能:矩阵的行列以及元素的输入
函数形参:无
函数返回值:无
***********************************************************/
void matrix::matrix_input(void)
{
cout << "please input the row and column:" << endl;
cin >> row >> column;
matrixp = new int[row*column];
cout << "please input the matrix:" << endl;
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
cin >> matrixp[i*column + j];
}
}
}
/***********************************************************
函数名称:void matrix::matrix_output(void)
函数类型:类成员函数
函数功能:矩阵的元素的输出
函数形参:无
函数返回值:无
***********************************************************/
void matrix::matrix_output(void)
{
cout << " the matrix is:" << endl;
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
cout << matrixp[i*column + j] << ' ';
}
cout << endl;
}
}
/***********************************************************
函数名称:matrix::matrix()
函数类型:构造函数
函数功能:矩阵的行列以及元素的输入
函数形参:无
函数返回值:无
***********************************************************/
matrix::matrix()
{
matrix_input();
}
/***********************************************************
函数名称:matrix::matrix(const matrix &matrix1)
函数类型:拷贝构造函数
函数功能:复制矩阵,深拷贝
函数形参:matrix类型矩阵
函数返回值:无
***********************************************************/
matrix::matrix(const matrix &matrix1)
{
row = matrix1.row;
column = matrix1.column;
matrixp = new int[row*column];
cout << "深拷贝" << endl;
for (int i = 0;i < row;i++)
{
for (int j = 0;j < column;j++)
{
matrixp[i*column + j] = matrix1.matrixp[i*column + j];
}
}
}
/***********************************************************
函数名称:matrix::~matrix()
函数类型:析构函数
函数功能:内存释放
函数形参:无
函数返回值:无
***********************************************************/
matrix::~matrix()
{
delete[]matrixp;
}
/***********************************************************
matrix::matrix(matrix &matrix1, matrix &matrix2, const char &str)
函数类型:拷贝构造函数
函数功能:完成矩阵乘法和加法的运算
函数形参:matrix类型的矩阵matrix1和matrix2,char类型的操作符
函数返回值:无
***********************************************************/
matrix::matrix(matrix &matrix1, matrix &matrix2, const char &str)
{
if (str == '*')
{
if (matrix2.row != matrix1.column)
{
cout << "matrix2.row != matrix1.column" << endl;
exit(0);
}
row = matrix1.row;
column = matrix2.column;
matrixp = new int[row*column];
matrix_mul(matrix1, matrix2);
}
else if (str == '+')
{
if (matrix1.row != matrix2.row || matrix1.column != matrix2.column)
{
cout << "matrix1.row != matrix2.row OR matrix1.column != matrix2.column" << endl;
exit(0);
}
row = matrix1.row;
column = matrix1.column;
matrixp = new int[row*column];
matrix_plus(matrix1, matrix2);
}
}
/***********************************************************
matrix::matrix_plus(matrix &matrix1, matrix &matrix2)
函数类型:类成员函数
函数功能:完成加法的运算
函数形参:matrix类型的矩阵matrix1和matrix2
函数返回值:无
***********************************************************/
void matrix::matrix_plus(matrix matrix1, matrix matrix2)
{
for (int i = 0; i<matrix1.row; i++)
{
for (int j = 0; j<matrix1.column; j++)
{
matrixp[i*column + j] = matrix1.matrixp[i*column + j] + matrix2.matrixp[i*column + j];
}
}
}
/***********************************************************
matrix::matrix_plus(matrix &matrix1, matrix &matrix2)
函数类型:类成员函数
函数功能:完成乘法的运算
函数形参:matrix类型的矩阵matrix1和matrix2
函数返回值:无
***********************************************************/
void matrix::matrix_mul(matrix matrix1, matrix matrix2)
//将此部分改为引用,无需定义拷贝构造函数???
//void matrix::matrix_mul(matrix matrix1, matrix matrix2)
//此函数需要将实参值拷贝给形参,只调用调用拷贝构造函数,不调用一般的构造函数
{
for (int i = 0; i<row; i++)
{
for (int j = 0; j<column; j++)
{
int sum = 0;
for (int k = 0; k<matrix1.column; k++)
{
sum += matrix1.matrixp[i*matrix1.column + k] * matrix2.matrixp[k*column + j];
}
matrixp[i*column + j] = sum;
}
}
}
main.cpp文件
#include<iostream>
#include "matrix.h"
using namespace std;
int main()
{
matrix matrix1, matrix2;
matrix matrix3 = matrix(matrix1, matrix2,'*');
//matrix3.matrix_mul(matrix1, matrix2);
matrix3.matrix_output();
getchar();
}