C++代码编程学习:基于对象的编程风格——习题4.5(Essential C++ 第四章)

C++中基于对象的编程风格的学习,非常有难度,概念很抽象,操作起来也比较费脑子,这里主要把一些知识点和习题给过一遍!

一、前言

  C++中基于对象的编程风格的学习(Essential C++ 第四章)。

二、例题

-P235 练习 4.5
  请实现一个4x4的Matrix class,至少提供以下接口:矩阵加法、矩阵乘法、打印函数 print()、复合运算符+=,以及一组支持下标操作(subscriping)的 function call 运算符,像下面这样:
  float& operator()( int row,int column );
  float operator()(int row,int column )const;
  请提供一个 default constructor,可选择性地接受16个数据值。再提供一个 constructor,可接受个拥有16个元素的数组。你不需要为此class提供copy constructor copy assignmentoperator 、destructor第6章重新实现 Matrix class 时才会需要这几个函数,用以支持任意行列的矩阵。

  • 先分析一下,一共有这几件事情要做:
    1. 4x4的Matrix class;
    1. Matrix class支持:矩阵加法、矩阵乘法、打印函数 print()、复合运算符+=、下标操作;
    1. 提供一个 default constructor,可选择性地接受16个数据值。

#include <iostream>using namespace std;typedef float elemType;class Matrix
{// friend 声明一般放在class一开始之处friend Matrix operator+(const Matrix&, const Matrix&);friend Matrix operator*(const Matrix&, const Matrix&);public:Matrix(const elemType*);Matrix(elemType = 0.0, elemType = 0.0, elemType = 0.0, elemType = 0.0,elemType = 0.0, elemType = 0.0, elemType = 0.0, elemType = 0.0,elemType = 0.0, elemType = 0.0, elemType = 0.0, elemType = 0.0,elemType = 0.0, elemType = 0.0, elemType = 0.0, elemType = 0.0);// 获取矩阵的行列数int rows() const { return 4; }int cols() const { return 4; }// 打印函数ostream& print(ostream&) const;// += 函数void operator+=(const Matrix&);// 下标获取elemType operator() (int row,int col ) const{return _matrix[row][col];}elemType& operator()(int row, int col){return _matrix[row][col];}private:elemType _matrix[4][4];};// 重载输出
inline ostream& operator<<(ostream& os, const Matrix& m)
{return m.print(os);
}Matrix operator+(const Matrix &m1, const Matrix &m2)
{Matrix result(m1);result += m2;return result;
}
Matrix operator*(const Matrix &m1, const Matrix &m2)
{Matrix result;for (int ix = 0; ix < m1.rows(); ++ix){for (int jx = 0; jx < m1.cols(); ++jx){result(ix, jx) = 0;for (int kx = 0; kx < m1.cols(); ++kx){result(ix, jx) += m1(ix, kx) * m2(kx, jx);}}}return result;
}// 打印函数
ostream& Matrix::print(ostream &os) const
{int cnt = 0;for (int ix = -0; ix < 4; ++ix){for(int jx=0;jx<4;++jx,++cnt){if (cnt && !(cnt % 4))os << endl;os << _matrix[ix][jx] << ' ';}}os << endl;return os;
}
// += 函数
void Matrix::operator+=(const Matrix &m)
{for (int ix = 0; ix < 4; ++ix){for (int jx = 0; jx < 4; ++jx){_matrix[ix][jx] += m._matrix[ix][jx];}}
}Matrix::Matrix(const elemType* arr)
{int arr_idx = 0;for (int ix = 0; ix < 4; ++ix){for (int jx = 0; jx < 4; ++jx){_matrix[ix][jx] = arr[arr_idx++];}}
}Matrix::Matrix(elemType a11, elemType a12, elemType a13, elemType a14, elemType a21, elemType a22, elemType a23, elemType a24, elemType a31, elemType a32, elemType a33, elemType a34, elemType a41, elemType a42, elemType a43, elemType a44 )
{_matrix[0][0] = a11; _matrix[0][1] = a12; _matrix[0][2] = a13; _matrix[0][3] = a14;_matrix[1][0] = a21; _matrix[1][1] = a22; _matrix[1][2] = a23; _matrix[1][3] = a24;_matrix[2][0] = a31; _matrix[2][1] = a32; _matrix[2][2] = a33; _matrix[2][3] = a34;_matrix[3][0] = a41; _matrix[3][1] = a42; _matrix[3][2] = a43; _matrix[3][3] = a44;
}int main()
{Matrix m;cout << m << endl;elemType ar[16] = {1.,2.,3.,4.,2.,3.,4.,1.,3.,4.,1.,2.,4.,1.,2.,3.};// 赋值1Matrix identity(ar);cout << identity << endl;// 赋值2Matrix m2(identity);m = identity;cout << m2 << endl;cout << m << endl;// 赋值3elemType ar2[16] = {0.1,0.2,0.3,0.4,0.2,0.3,0.4,0.1,0.3,0.4,0.1,0.2,0.4,0.1,0.2,0.3,};Matrix m3(ar2); cout << m3 << endl;// 乘法Matrix m4 = m3 * identity;cout<< m4 << endl;// 加法Matrix m5 = m3 + m4;cout << m5 << endl;m3 += m4;cout << m3 << endl;}
  • 这道题非常的赞哦,函数重载,友元,类函数,好美妙啊!

在这里插入图片描述

代码是在 visual studio 中编写的,该软件还是比较好用的,我安装的是2022专业版;

共勉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3223798.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

设计无缝体验:交互设计流程全解析

完整的产品交互设计流程是什么&#xff1f;完整的产品交互设计流程包括研究用户需求、指定信息架构、制作产品原型、进行用户测试和实时发布产品。交互设计就是从人与产品之间的关系入手&#xff0c;通过产品设计来满足大众的日常需求。随着网络技术的流行&#xff0c;产品交互…

快速将一个网址打包成一个exe可执行文件

一、电脑需要node环境 如果没有下面有安装教程&#xff1a; node.js安装及环境配置超详细教程【Windows系统安装包方式】 https://blog.csdn.net/weixin_44893902/article/details/121788104 我的版本是v16.13.1 二、安装nativefier 这是一个GitHub上的开源项目&#xff1a…

Codeforces Round 954 (Div. 3) F. Non-academic Problem

思路&#xff1a;考虑缩点&#xff0c;因为是无向图&#xff0c;所以双连通分量缩完点后是一棵树&#xff0c;我们去枚举删除每一条树边的答案&#xff0c;然后取最小值即可。 #include <bits/stdc.h>using namespace std; const int N 3e5 5; typedef long long ll; …

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片(Form_Vision部分代码)

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片(Form_Vision部分代码) 1 目标效果视频 CamManager 2 增加一个class IMG_BUFFER 用来管理采集的图片 // <summary> /// IMG_BUFFER 用来管理内存图片的抓取队列 /// </summary> public class IMG_BUFF…

AI赋能,全面筑牢防线:重点非煤矿山重大灾害风险防控系统探析

一、背景需求 随着工业化和现代化的快速发展&#xff0c;非煤矿山作为重要的资源开采基地&#xff0c;其安全生产问题日益受到社会各界的广泛关注。非煤矿山在开采过程中&#xff0c;面临着诸多重大灾害风险&#xff0c;如滑坡、坍塌、水害、火灾等&#xff0c;这些灾害一旦发…

前端面试题34(在移动应用中,通用的实时传输协议)

在移动应用中&#xff0c;选择实时传输协议时通常会考虑几个关键因素&#xff1a;网络效率、功耗、实时性、跨平台兼容性以及数据类型&#xff08;如文本、图像、视频&#xff09;。以下是几种常用的实时传输协议及其在移动应用中的适用性&#xff1a; 1. WebSocket WebSocke…

Java面试八股之MySQL中int(10)和bigint(10)能存储读的数据大小一样吗

MySQL中int(10)和bigint(10)能存储读的数据大小一样吗 在MySQL中&#xff0c;int(10)和bigint(10)的数据存储能力并不相同&#xff0c;尽管括号内的数字&#xff08;如10&#xff09;看起来似乎暗示着某种关联&#xff0c;但实际上这个数字代表的是显示宽度&#xff0c;而不是…

threejs基础入门案例研究——三维立体物体沿指定曲线循环移动

效果 代码展示 主要思路是先创建指定曲线路径,并将其分为1000个点,然后按照自定义路线从头遍历点的位置,然后修改物体位置以及朝向等,实现三维立体物体沿指定曲线循环移动的效果。这里以vue3代码为例,进行展示 <template><div class="threejs">&l…

web Worker学习笔记 | 浏览器切换标签,定时器失效的解决办法

文章目录 web Workerweb Worker介绍 - 多线程解决方案浏览器多进程架构 web workers 的使用关闭worker引用其他js文件 浏览器切换标签&#xff0c;定时器失效的解决办法窗口可见性 API解决定时器失效的方案 web Worker web Worker介绍 - 多线程解决方案 Web Workers 是Html5提…

考研数学什么时候开始强化?如何保证进度不掉队?

晚了。我是实在人&#xff0c;不给你胡乱吹&#xff0c;虽然晚了&#xff0c;但相信我&#xff0c;还有的救。 实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张... 中间基本没有试错的时间&#xff0c;让你换…

关于腾讯的那些事(6月新闻纪要)

祝贺&#xff01;深圳市科技进步一等奖 这份文件是关于腾讯云数据库TDSQL获得深圳市科技进步一等奖的详细报道。以下是详细总结分析&#xff1a; 获奖荣誉&#xff1a; 腾讯云数据库TDSQL荣获2022年深圳市科技进步一等奖&#xff0c;成为唯一入选的数据库产品。该奖项由深圳市…

【自学网络安全】:安全策略与用户认证综合实验

实验拓扑图&#xff1a; 实验任务&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10.0.2.10不允许访问Dmz区…

FAO(脂肪酸β-氧化,Fatty acid beta-oxidation)应用实例

一、FAOBlue及其香豆素衍生物的吸收光谱和荧光光谱 在PBS缓冲液&#xff08;pH 7.4&#xff09;中&#xff0c;FAO代谢后释放的FAOBlue和香豆素衍生物的吸收光谱&#xff08;左&#xff09;、荧光光谱&#xff08;右&#xff09;。 FAOBlue经过FAO转化为香豆素衍生物后&#…

宝塔面板运行Admin.net框架

准备 宝塔安装 .netcore安装 Admin.net框架发布 宝塔面板设置 完结撒花 1.准备 服务器/虚拟机一台 系统Windows server / Ubuntu20.04&#xff08;本贴使用的是Ubuntu20.04版本系统&#xff09; Admin.net开发框架 先安装好服务器系统&#xff0c;这里就不做安装过程描述了&…

微信零钱明细删除了还能恢复吗?图文教程解析

在日常使用微信支付的过程中&#xff0c;查看零钱明细是管理个人财务的一项重要操作。然而&#xff0c;有时候我们可能会不小心删除了这些明细&#xff0c;导致无法追踪资金流动和消费记录。那么&#xff0c;微信零钱明细删除了还能恢复吗&#xff1f;这是许多用户关心的问题。…

【Python实战因果推断】18_线性回归的不合理效果8

目录 Saturated Regression Model Regression as Variance Weighted Average Saturated Regression Model 还记得我在本章开头强调回归和条件平均值之间的相似性吗&#xff1f;我向你展示了使用二元干预进行回归与比较干预组和对照组的平均值是完全一样的。现在&#xff0c;由…

Github绑定自己的域名

Github绑定自己的域名 1.注册自己的域名2.在GitHUb上创建一个自己的仓库&#xff0c;添加域名2.1 创建仓库2.2 添加域名2.3 在Setting中将域名添加到Custom domain中 3.添加域名解析获取ip地址4.在阿里云修改域名解析记录5.ping 域名即可成功 详细内容可参该博客&#xff1a; …

24吉林事业单位报名照上传通过别忘了这一步

24吉林事业单位报名照上传通过别忘了这一步 #吉林事业单位 #吉林三支一扶 #吉林事业编 #事业单位报名照片 #吉林事业单位考试 #吉林市事业单位

gitee及git的简单使用、下载教(保姆级教程)

前言&#xff1a; GitHub&#xff0c;一个由外国研发的代码开源网站&#xff0c;我们可以通过它获得别人优秀的项目源码&#xff0c;也可以在上面上传自己的劳动成果。但是&#xff0c;我们很难访问外网。于是&#xff0c;我们将目光转向国内一个类似的网站---码云&#xff08…

遍历请求后端数据引出的数组forEach异步操作的坑

有一个列表数据&#xff0c;每项数据里有一个额外的字段需要去调另外一个接口才能拿到&#xff0c;后端有现有的这2个接口&#xff0c;现在临时需要前端显示出来&#xff0c;所以这里需要前端先去调列表数据的接口拿到列表数据&#xff0c;然后再遍历请求另外一个接口去拿到对应…