一、头文件创建

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类设计与实现相关推荐

  1. C++程序设计:实验一 CMatrix类设计与实现

    前言 在实验一当中,主要内容为CMatrix类的设计与实现,包含了CMatrix.h,CMatrix.cpp以及main.cpp三大文件. 文章目录 前言 一.实验要求: 1.构造函数 2.析构函数 ...

  2. C++学习记录 实验1 CMatrix类设计与实现

    目录 一.源码实现 1.1 Main.cpp 1.2 CMatrix.cpp 1.3 CMatrix.h 二.知识小结 2.1 构造函数和析构函数 2.1.1 构造函数和析构函数的由来 2.1.2 构 ...

  3. C++ [实验一] CMatrix类设计与实现

    目录 一.实验内容 二.代码实现 1.main.cpp 2.CMatrix.h 3.CMatrix.cpp 4.文本文件 1.txt 三.运行结果 四.代码分析 1.构造函数 2.析构函数 3.运算符 ...

  4. C++-实验一 CMatrix类设计

    文章目录 前言 一.代码部分 1.Main函数 2.CMatrix.h 3.CMatrix.cpp 二.运行结果 三.总结 一. 构造和析构函数: 二. 运算符重载: 三. 友元函数: 前言 争取一周 ...

  5. 实验1 CMatrix类设计与实现

    一.头文件的创建 C++对于创建一个类以及各项方法的推荐做法是在头文件.h中将类中所有的函数,变量预先定义,之后再在另一个.cpp文件中将这些所有方法一一实现,所以我们需要将我们对于矩阵类(我们之后都 ...

  6. C++ ——CMatrix类设计与实现

    CMatrix类设计与实现 实验内容: 一.构造函数 1.CMatrix(): 不带参数的构造函数: 2.CMatrix(int nRow, int nCol, double *pData=NULL) ...

  7. C++ CMatrix类设计与实现

    实验一:CMatrix类设计与实现 一 代码实现 1.main.cpp 2.CMatrix.h 3.CMatrix.cpp 二 运行截图 三 总结 1.构造函数 2.析构函数 3.运算符重载 4.友元 ...

  8. CMatrix类设计

    文章目录 前言 一.实验内容 二.实现代码 1.main.cpp 2.CMatrix.h 3.CMatrix.h 4.运行结果 总结 前言 通过对CMatrix类的设计熟悉c++的类与对象,多态,构造 ...

  9. C++实验(一)—— CMatrix类设计与实现

    目录 一.代码理解 CMatrix.h CMatrix.cpp Main.cpp 运行结果 二.总结 一.代码理解 CMatrix.h #ifndef CMATRIX_H //防止被重复引用 #def ...

最新文章

  1. SSH没有password安全日志
  2. war包部署-排除内嵌的tomcat
  3. 安装配置OSA运维管理平台
  4. 【ambari】Ambari Rest api 使用
  5. Spring Boot+HATEOAS快速介绍与示例
  6. xxx is not in the sudoers file. This incident will be reported
  7. mysql 两个结果集求差
  8. 开发者编程时应该围着“程序”转吗?
  9. ubuntu解决网易云无法打开
  10. UVA722 LA5359 Lakes【DFS】
  11. Spring Cloud整合Seata实现2PC二阶段分布式事务
  12. swfobject介绍
  13. 音视频开发:多播系统中RTP如何工作?
  14. SPSS:主成分分析确定不同指标权重
  15. 故障检测、故障识别领域(分类问题)的性能评价指标
  16. IPSec基础-IPSec协议类型
  17. esp32对接阿里云生活物联网平台 天猫精灵控制 云智能APP远程控制 ali-sdk开发
  18. 汉语编程的时代会到来吗?
  19. Android无法安装apk,8.0未知来源应用安装权限
  20. 使用tftp32软件对思科交换机导入导出配置【思科交换机技能进阶2】

热门文章

  1. 信息安全技术实验:利用 burp suite破解 web 后台
  2. 明黄色一代-亿唐网的没落
  3. linux usb免驱麦克风,Linux下Skype使用免驱摄像头
  4. logback报错:ERROR in ch.qos.logback.core.joran.conditional.IfAction
  5. java基于ssm+vue的驾校预约管理系统 elementui
  6. npm run build打包产生的build文件夹通过nginx部署到服务器上访问(centos8)
  7. Python爬虫403错误的解决方案
  8. Adobe Photoshop CC 2015.5(ps)安装步骤
  9. 《从0开始学产品策划》第一期:认清项目本质
  10. Matter-JS 入门教程