C++拷贝构造函数的理解

题目:用类定义的方法完成矩阵的加法和乘法

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();
}




































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值