目录

一、CMatrix代码实现

1、main.cpp

2、CMatrix.h

3、CMatrix.cpp

二、运行结果

三、总结

1、构造函数

2、析构函数

3、运算符重载

4、友元函数


一、CMatrix代码实现

1、main.cpp

#include<iostream>
#include"CMatrix.h"
using namespace std;
int main() {double pData[10] = { 12,23,34,45 };CMatrix m1, m2(2, 5, pData);cin >> m1;m2.Set(1, 3, 18);cout << m1 << m2;CMatrix ms[4] = { CMatrix(),CMatrix(2,5,pData),CMatrix(ms[1]),CMatrix("D:\\1.txt") };cout << ms[1] << ms[2];if (ms[1] != ms[2]){cout << "Error occur!" << endl;}ms[1] += ms[2];ms[1][1] = 100;ms[1](1, 1) = 50;cout << ms[1];cout << "sum of m1=" << double(ms[1]);double d = 1.2;int i = int(d);return 0;
}

2、CMatrix.h

#pragma once
#include<iostream>
using namespace std;class CMatrix {
public:CMatrix();//不带参数的构造函数;CMatrix(int nRow, int nCol, double* pData = NULL);//带行、列及数据指针等参数的构造函数,并且参数带默认值;CMatrix(const CMatrix& m);//拷贝构造函数CMatrix(const char* strPath);//带文件路径参数的构造函数;~CMatrix();//析构函数//先删除原有空间,根据传入行列创建空间,如果pData不为空要将pData的内容拷贝到m_pData中。bool Create(int nRow, int nCol, double* pData = NULL);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();private:int m_nRow;int m_nCol;double* m_pData;
};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;
}

3、CMatrix.cpp

#include "CMatrix.h"
#include<fstream>
#include<iostream>
#include<assert.h>
using namespace std;
CMatrix::CMatrix() {m_nRow = m_nCol = 0;m_pData = 0;
}
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;
}
CMatrix::CMatrix(const char* strPath) {m_pData = 0;m_nCol = m_nRow = 0;ifstream cin(strPath);cin >> *this;
}
CMatrix::~CMatrix() {Release();
}
bool CMatrix::Create(int nRow, int nCol, double* pData) {Release();m_pData = new double[nRow * nCol];m_nCol = nCol;m_nRow = nRow;if (pData) {memcpy(m_pData, pData, nRow * nCol * sizeof(double));}return true;
}
void CMatrix::Release() {if (m_pData) {delete[] m_pData;m_pData = NULL;}m_nRow = m_nCol = 0;
}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_nCol * m.m_nRow; i++) {is >> m.m_pData[i];}return is;
}
ostream& operator<<(ostream& os, const CMatrix& m)
{os << "m_nRow  " << m.m_nRow << " " << "m_nCol  " << 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& CMatrix::operator=(const CMatrix& m)
{if (this != &m) {Create(m.m_nRow, m.m_nCol, m.m_pData);}return*this;
}
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 + nCol < m_nRow* m_nCol);return m_pData[nRow * m_nCol + nCol];
}
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::operator double()
{double ds = 0;for (int i = 0; i < m_nRow * m_nCol; i++){ds += m_pData[i];}return ds;
}

二、运行结果

输入任意矩阵规模(3*3)以及矩阵

三、总结

1、构造函数

  • 构造函数,没有返回值也不写void
  • 函数名称和类名相同
  • 构造函数可以有参数,因此可以发生重载
  • 程序在调用对象时候会自动调用构造,无须手动调用,并且只会调用一次
  • double* pData=NULL 无pData传入时默认进行赋值null

2、析构函数

  • 析构函数,没有返回值也不写void
  • 函数名称与类名相同,在名称前加上符号~
  • 析构函数不可以有参数,因此不可以发生重载
  • 程序在对象销毁前会自动调用析构,无须手动调用,并且只会调用一次

3、运算符重载

  • CMatrix & CMatrix:: operator = (const CMatrix &m)表示一个运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。
  • this是指向自身对象的指针,*this是自身对象。也就是说return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 )。return this返回当前对象的地址(指向当前对象的指针)。
  • CMatrix:: operator double()函数无需指明返回类型,double作为一个运算符,该函数用于double运算符重载。

4、友元函数

  • 在类中声明友元函数使其可以访问类的私有数据
  • friend和operator同时使用可以让其他类对数据进行的操作符进行自定义

【C++实验一】 实现CMatrix类相关推荐

  1. 【c++实验一】CMatrix类设计与实现

    实验内容: 一.构造函数 CMatrix(): 不带参数的构造函数: CMatrix(int nRow, int nCol, double *pData=NULL) : 带行.列及数据指针等参数的 ...

  2. C++实验一之CMatrix类设计与实现

    一.代码设计 1.1 构造函数 CMatrix(): 不带参数的构造函数: CMatrix(int nRow, int nCol, double *pData=NULL) : 带行.列及数据指针等 ...

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

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

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

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

  5. [C++学习实验1]CMatrix类设计与实现

    一.头文件创建 1.头文件定义了CMatrix类.类內部属性.函数.以及各种调用方法 头文件定义格式如下,属于条件编译宏定义,可以根据条件选择性的只编译某段程序,也可以防止重复定义. #ifndef ...

  6. CMatrix类设计

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

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

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

  8. java有理数类的封装_java实验报告有理数的类封装.doc

    java实验报告有理数的类封装 华中科技大学文华学院 <Java程序设计>实验报告 实验三:有理数的类封装 专业班级: 通信工程2008级1班 姓名: 学号: 时间: 实验三:有理数的类封 ...

  9. 《Java程序设计》实验指导——项目3 类与对象

    项目3 类与对象 实验目的 实验性质 实验内容 实验目的 掌握Java类的结构.类的定义.方法和属性的定义以及对象的实现:掌握类及其成员修饰符的使用:掌握构造函数的使用:方法的参数传递和返回值的用法: ...

  10. C++面向对象程序设计实验题:有理数类(分数类)设计

    C++实验题:有理数类(分数类)设计 问题描述: 根据main测试函数设计有理数类CRational,数据成员由分子.分母组成(都是整型,应表示成最简形式),完成分数显示(如用户输入的分子是4,分母是 ...

最新文章

  1. webview Java与JS互调
  2. Java学习总结:5
  3. 面试定心丸:AI知识点备忘录(包括ML、DL、Python、Pandas等)
  4. 参加第十届的队员给智能车竞赛的建议:抄能力+钞能力使得一届不如一届
  5. 机器学习案例 特征组合——高帅富 冷启动——从微博等其他渠道搜集数据进行机器学习 用户年龄——线性分段处理...
  6. 使用关指定中断解决资源冲突问题
  7. ML之FE:基于BigMartSales数据集利用Featuretools工具实现自动特征工程之详细攻略daiding
  8. 【视频基础】封装格式和编码格式
  9. 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
  10. 复杂分组统计---表在文件中
  11. JS中怎样比较两个 时分秒 格式的时间大小
  12. error_reporting
  13. 6. OD-去除收费软件次数限制,去除退出软件时弹出的广告(比如可执行5次)
  14. python爬虫什么意思-这样学Python爬虫,想爬什么爬什么
  15. 软件项目需求分析报告模板
  16. dtcms 数据库结构分析
  17. 微软服务器工程师认证,微软认证的系统工程师(MCSE)
  18. c语言编程计算缴税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  19. MySQL open_tables和opened_tables
  20. 准备嵌入式Linux开发环境

热门文章

  1. 常用博客SEO优化技巧
  2. python控制摄像头拍照_microbit使用蓝牙控制树莓派摄像头拍照
  3. 使用 ES 实现疫情地图或者外卖点餐功能(含代码及数据)
  4. 使用ActiveX控件
  5. 地图弹框选择地点,返回经纬度
  6. 访金山云CTO杨刚:开源改进PK自主研发,技术驱动前行
  7. c4droid教程_Android教程:进入DROID世界
  8. 【GNSS】GNSS处理中的时间系统
  9. 蓝桥杯试题 算法训练 进击的青蛙 python
  10. 某信服终端检测响应平台任意用户登录