[C++学习实验1]CMatrix类设计与实现
一、头文件创建
1.头文件定义了CMatrix类、类內部属性、函数、以及各种调用方法
头文件定义格式如下,属于条件编译宏定义,可以根据条件选择性的只编译某段程序,也可以防止重复定义。
#ifndef CMATRIX_H
#define CMATRIX_H
// 具体的
// 头文件
// 正文内容#endif
二、有几类函数:
1.构造函数
①不带参数的构造函数;// CMatrix();
②带行、列及数据指针等参数的构造函数,并且参数带默认值;//CMatrix(int nRow, int nCol, double *pData=NULL) ;
③带文件路径参数的构造函数;//CMatrix(const char * strPath);
④ 拷贝构造函数 //CMatrix(const CMatrix& m);
⑤此外会用列表初始化成员变量:CMatrix(): m_nRow(0), m_nCol(0), m_pData(NULL);
bool Create(int nRow, int nCol, double *pData=NULL): 先删除原有空间,根据传入行列创建空间,如果pData不为空要将pData的内容拷贝到m_pData中。
CMatrix的一个重载函数:当m_pData的空间不能容纳n_Row*n_Col时 m_pData=NULL
▲特点:
构造函数具有如下几个特点:
①名字与类名相同,可以有参数,但是不能有返回值(void也不行);
②作用是对对象进行初始化工作,如给成员变量赋值等;
③如果定义类时没有写构造函数,系统会生成一个默认的无参构造函数,默认构造函数没有参数,不做任何工作;
④如果定义了构造函数,系统不再生成默认的无参构造函数;
⑤对象生成时构造函数自动调用,对象一旦生成,不能在其上再次执行构造函数
一个类可以有多个构造函数,为重载关系。
其中:构造函数CMatrix的初始化有两种方式:
①在给变量分配空间时就直接赋值即可,这种方法初始化效率较高
②在分配空间之后再给变量赋值
值得注意的是,初始化时,变量的顺序必须和定义时变量的顺序一致
▲用法:
CMatrix::CMatrix()
{m_nRow = 0;m_nCol = 0;m_pData = NULL;
}// 注意:传入参数的顺序和在类间定义时顺序一致
CMatrix::CMatrix():m_nRow(0), m_nCol(0), m_pData(0)
{// 初始化为NULL
}// 有参构造函数
CMatrix::CMatrix(int nRow, int nCol, double *pData):m_pData(0)
{Create(nRow,nCol,pData); //调用创建对象的方法
}// 拷贝构造函数
CMatrix::CMatrix(const CMatrix& m):m_pData(0)
{*this = m; // 因为这里的*this表示对象指针,赋值的是地址
}// 对str对象操作
CMatrix::CMatrix(const char * strPath)
{m_pData = 0;m_nRow = m_nCol = 0;ifstream cin(strPath); // 文件操作cin >> *this;
}
2. 析构函数
①调用Release(); // ~CMatrix():
②将内存释放,并将行列设置为0;//Release():
▲特点:
①析构函数名应与类名相同,只是在函数名前面加一个位取反符,以区别于构造函数。
②它不能带任何参数,也没有返回值(包括void类型)。由于没有函数参数,因此它不能被重载,只能有一个析构函数。
③如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。
④当对象的生命周期结束时,撤销类对象时候会自动调用析构函数。
⑤对象在生命期结束,撤销类对象时会自动调用析构函数。
⑥如果用new运算动态地建立一个对象,那用delete运算符释放该对象时,才会调用析构函数。
▲用法:
// 析构函数,用于释放
CMatrix::~CMatrix()
{Release();
}
3.运算符重载
①算术运算符重载:+, -, +=, -=
②关系运算符重载:>, <, ==
③下标操作符:[], ()
④强制类型转换: double
⑤赋值运算符:=,尤其注意当m1=m1特殊情况的处理
▲用法:
CMatrix& operator=(const CMatrix& m);
CMatrix& operator+=(const CMatrix& m);
double& operator[](int nIndex);
double& operator()(int nRow, int nCol);
bool operator ==(const CMatrix& m);
bool operator !=(const CMatrix& m);
△运算符重载
// "="重载
CMatrix& CMatrix::operator = (const CMatrix& m)
{if(this!=&m){Create(m.m_nRow, m.m_nCol, m.m_pData);}return *this;
}// "=="重载
bool CMatrix::operator == (const CMatrix& m)
{if(!(m_nRow == m.m_nRow && m_nCol == m.m_nCol)){return false;}for(int i = 0; i < m_nRow * m_nCol; i++){if(m_pData[i] != m.m_pData[i]){return false;}}return true;
}// "!="重载
bool CMatrix::operator != (const CMatrix& m){return !((*this)==m);
}// "+="重载
CMatrix& CMatrix::operator += (const CMatrix& m)
{assert(m_nRow == m.m_nRow && m_nCol == m.m_nCol);for(int i=0;i < m_nRow * m_nCol;i++){m_pData[i]+=m.m_pData[i];}return *this;
}// "+"重载
CMatrix operator + (const CMatrix& m1, const CMatrix& m2)
{CMatrix m3(m1);m3 += m2;return m3;
}// "-="重载
CMatrix& CMatrix::operator -= (const CMatrix& m)
{assert(m_nRow==m.m_nRow && m_nCol==m.m_nCol);for (int i=0;i<m_nRow*m_nCol;i++){m_pData[i]-=m.m_pData[i];}return *this;
}// "-"重载
CMatrix operator - (const CMatrix& m1, const CMatrix& m2)
{CMatrix m3(m1);m3 -= m2;return m3;
}
△操作符重载
// "[]"重载
double & CMatrix::operator[](int nIndex)
{//判定下标越界assert(nIndex<m_nRow*m_nCol);return m_pData[nIndex];
}// "()"重载
double & CMatrix::operator()(int nRow, int nCol)
{//判定下标越界assert(nRow * m_nCol + nCol < m_nRow * m_nCol);return m_pData[nRow * m_nCol + nCol];
}// ">>"重载
istream & operator>>(istream& is, CMatrix & m)
{is>>m.m_nRow>>m.m_nCol;// 初始化m.Create(m.m_nRow, m.m_nCol);// 逐行赋值for(int i=0;i<m.m_nRow*m.m_nCol;i++){is>>m.m_pData[i];}return is;
}// "<<"重载
ostream & operator<<(ostream& os, const CMatrix &m)
{os<<"size:["<<m.m_nRow<<","<<m.m_nCol<<']'<<endl;double * pData = m.m_pData;// 按行列顺序输出矩阵元素for(int i=0;i<m.m_nRow;i++){for(int j=0;j<m.m_nCol;j++){os<<*pData++<<" ";}os<<endl;}return os;
}// 强制类型转换重载
CMatrix::operator double()
{double dS=0;for(int i=0;i<m_nRow*m_nCol;i++){dS+=m_pData[i];}return dS;
}
4.友元函数
输入和输出运输符:<<, >>
friend istream& operator>>(istream& is, CMatrix& m);
friend ostream& operator<<(ostream& os, const CMatrix& m);
①赋予特权,特殊声明,friend加了之后为全局函数不是成员函数,类里面定义的所有对象都可以调用,所以可以访问下面的private私有变量;
②输出输入流运算符重载,原本输出输入流只能针对基础的数据类型,比如char,int,double,指针,重载后使其能够读取自己定义的类。
5.主函数
#include <iostream>
#include <stdio.h>
#include "CMatrix.h"
using namespace std;int main(int argc, char** argv) {double pData[10] = {2,3,4,5};CMatrix m1, m2(2, 5, pData), m3("./1.txt"), m4(m2);cin >> m1;m2.Set(1,3,10);cout << m1 << m2 << m3 << m4;m4 = m3;m4[2] = m4 + 1;if(m4 == m3) {cout << "Error !" << endl;}m4 += m3;cout << "sum of m4 = " << (double)m4 << endl;return 0;
}
三、正文内容如下:
#ifndef CMATRIX_H
#define CMATRIX_H#include<iostream>using namespace std;class CMatrix
{
private: //二维矩阵类变量定义int m_nRow;//行数int m_nCol;//列数double * m_pData=NULL;//用于存储矩阵中所有值地址的指针,初始化为NULLpublic:CMatrix(); //构造器//如果nRow=0有默认值则之后的都得有默认值//若都默认值为0,相当于无参数,则会与上一个构造函数CMatrix();产生歧义,不知道调用哪一个//带行、列及数据指针等参数的构造函数, 并且参数带默认值CMatrix(int nRow, int nCol, double * pDate = NULL); //拷贝构造函数CMatrix(const CMatrix& m); //带文件路径参数的构造函数CMatrix(const char * strPah);~CMatrix(); //析构函数bool Create(int nRow, int nCol, double* pDate); //初始化void Set(int nRow, int nCol, double dVale); //内联函数void Release(); //释放内存//操作符重载friend istream & operator >>(istream& is, CMatrix & m);//友元函数 在外部就可以访问到正常情况下无法访问到的私有属性和方法。friend ostream& operator <<(ostream& os, const CMatrix &m);//运算符重载CMatrix& operator = (const CMatrix& m);CMatrix& operator+=(const CMatrix& m);double & operator[](int nIndex);double & operator()(int nRow,int nCol);bool operator == (const CMatrix& m);bool operator != (const CMatrix& m);//重载类型转换operator double();
};// 重载运算符 "+"
CMatrix operator+(const CMatrix& m1, const CMatrix& m2);
inline void CMatrix::Set(int nRow, int nCol, double dVal){m_pData[nRow*m_nCol + nCol]=dVal;}#endif
[C++学习实验1]CMatrix类设计与实现相关推荐
- C++程序设计:实验一 CMatrix类设计与实现
前言 在实验一当中,主要内容为CMatrix类的设计与实现,包含了CMatrix.h,CMatrix.cpp以及main.cpp三大文件. 文章目录 前言 一.实验要求: 1.构造函数 2.析构函数 ...
- C++学习记录 实验1 CMatrix类设计与实现
目录 一.源码实现 1.1 Main.cpp 1.2 CMatrix.cpp 1.3 CMatrix.h 二.知识小结 2.1 构造函数和析构函数 2.1.1 构造函数和析构函数的由来 2.1.2 构 ...
- C++ [实验一] CMatrix类设计与实现
目录 一.实验内容 二.代码实现 1.main.cpp 2.CMatrix.h 3.CMatrix.cpp 4.文本文件 1.txt 三.运行结果 四.代码分析 1.构造函数 2.析构函数 3.运算符 ...
- C++-实验一 CMatrix类设计
文章目录 前言 一.代码部分 1.Main函数 2.CMatrix.h 3.CMatrix.cpp 二.运行结果 三.总结 一. 构造和析构函数: 二. 运算符重载: 三. 友元函数: 前言 争取一周 ...
- 实验1 CMatrix类设计与实现
一.头文件的创建 C++对于创建一个类以及各项方法的推荐做法是在头文件.h中将类中所有的函数,变量预先定义,之后再在另一个.cpp文件中将这些所有方法一一实现,所以我们需要将我们对于矩阵类(我们之后都 ...
- C++ ——CMatrix类设计与实现
CMatrix类设计与实现 实验内容: 一.构造函数 1.CMatrix(): 不带参数的构造函数: 2.CMatrix(int nRow, int nCol, double *pData=NULL) ...
- C++ CMatrix类设计与实现
实验一:CMatrix类设计与实现 一 代码实现 1.main.cpp 2.CMatrix.h 3.CMatrix.cpp 二 运行截图 三 总结 1.构造函数 2.析构函数 3.运算符重载 4.友元 ...
- CMatrix类设计
文章目录 前言 一.实验内容 二.实现代码 1.main.cpp 2.CMatrix.h 3.CMatrix.h 4.运行结果 总结 前言 通过对CMatrix类的设计熟悉c++的类与对象,多态,构造 ...
- C++实验(一)—— CMatrix类设计与实现
目录 一.代码理解 CMatrix.h CMatrix.cpp Main.cpp 运行结果 二.总结 一.代码理解 CMatrix.h #ifndef CMATRIX_H //防止被重复引用 #def ...
最新文章
- SSH没有password安全日志
- war包部署-排除内嵌的tomcat
- 安装配置OSA运维管理平台
- 【ambari】Ambari Rest api 使用
- Spring Boot+HATEOAS快速介绍与示例
- xxx is not in the sudoers file. This incident will be reported
- mysql 两个结果集求差
- 开发者编程时应该围着“程序”转吗?
- ubuntu解决网易云无法打开
- UVA722 LA5359 Lakes【DFS】
- Spring Cloud整合Seata实现2PC二阶段分布式事务
- swfobject介绍
- 音视频开发:多播系统中RTP如何工作?
- SPSS:主成分分析确定不同指标权重
- 故障检测、故障识别领域(分类问题)的性能评价指标
- IPSec基础-IPSec协议类型
- esp32对接阿里云生活物联网平台 天猫精灵控制 云智能APP远程控制 ali-sdk开发
- 汉语编程的时代会到来吗?
- Android无法安装apk,8.0未知来源应用安装权限
- 使用tftp32软件对思科交换机导入导出配置【思科交换机技能进阶2】
热门文章
- 信息安全技术实验:利用 burp suite破解 web 后台
- 明黄色一代-亿唐网的没落
- linux usb免驱麦克风,Linux下Skype使用免驱摄像头
- logback报错:ERROR in ch.qos.logback.core.joran.conditional.IfAction
- java基于ssm+vue的驾校预约管理系统 elementui
- npm run build打包产生的build文件夹通过nginx部署到服务器上访问(centos8)
- Python爬虫403错误的解决方案
- Adobe Photoshop CC 2015.5(ps)安装步骤
- 《从0开始学产品策划》第一期:认清项目本质
- Matter-JS 入门教程