【C++进阶】利用重载二元运算符改进平面向量类Vec2D

先前回顾

在【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)中我们初步实现了Vec2D内容,现在做出一定的改进:

实现Vec2D的一半二元算数运算符重载
1、 + - (两个Vec2D对象运算以及1个Vec2D对象与一个double数运算)
2、*(点乘和数乘)
同时将之前涉及对象拷贝的函数用传引用的方式进行修改。
注意,若有对象拷贝则需要传引用,如果只是简单的值拷贝,则不需要传引用。

知识点

先看看我们一般是怎么调用二元运算符:
注意最后一个是个“错误”的写法,因为这个不属于成员函数的写法,z不是Vec2D类的对象。
但是常识告诉我们,这样写和d的写法应该是一样的。

Vec2D a{1,2}, b{3, 6}; double z {1.3};Vec2D c = a + b;  // a.operator+(b);  à Vec2D Vec2D::operator+(Vec2D);Vec2D d = a + z;  // a.operator+(z);  à Vec2D Vec2D::operator+(double);Vec2D e = z + b;  // z.operator+(b);  à Vec2D double::operator+(Vec2D);  错误!

下面是这几个重载函数的原型,注意最后一个是个友元函数,关于友元函数记不清的,请回顾:https://blog.csdn.net/qq_42604176/article/details/109537139

struct Vec2D {Vec2D operator +(Vec2D);                //成员函数Vec2D operator +(double);               //成员函数friend Vec2D operator +(double, Vec2D); //非成员(友元)函数};Vec2D operator +(double, Vec2D) { // Do something}

修改部分

1、首先完善h文件

#pragma once
#include <iostream>
#include <string>
#include <cmath>
#include <exception>
class Vec2D
{
private:double x_;double y_;
public:Vec2D();Vec2D(double , double );~Vec2D();// 将向量转换为字符串表达形式std::string toString();// 向量加法Vec2D add(const Vec2D& secondVec2D);//与数值相加Vec2D add(double num);//加法函数的重载Vec2D operator +(const Vec2D& secondVec2D);Vec2D operator +(const double num);// 读取或修改向量元素double& at(const int index);// 向量减法Vec2D subtract(const Vec2D& secondVec2D);//与数值相减Vec2D subtract(const double num);//减法函数的重载Vec2D operator -(const Vec2D& secondVec2D);Vec2D operator -(const double num);// 向量点积double dot(const Vec2D&  secondVec2D);// 向量数乘Vec2D multiply(const double multiplier);//向量乘法的重载double operator *(const Vec2D& secondVec2D);Vec2D operator *(const double multiplier);//补充一个乘法友元函数friend Vec2D operator *(const double multiplier,Vec2D vec2d);// 向量求负值Vec2D negative();// 向量自增1Vec2D& increase();// 向量自减1Vec2D& decrease();// 求向量的范数(长度)double magnitude();// 求Vec2D与x+轴的夹角double direction();// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0int compareTo(Vec2D secondVec2D);
};

2、在cpp文件中补充函数的具体细节

#include "Vec2D.h"
Vec2D::Vec2D() {x_ = 0.0;y_ = 0.0;
}Vec2D::Vec2D(double x, double y) {x_ = x;y_ = y;
}Vec2D::~Vec2D() {}// 将向量转换为字符串表达形式
std::string Vec2D::toString()
{// TODO: 在此处添加实现代码.return std::string("(" + std::to_string(x_) + ", "+ std::to_string(y_) + ")");
}// 向量加法
Vec2D Vec2D::add(const Vec2D& secondVec2D)
{// TODO: 在此处添加实现代码.return Vec2D(x_ + secondVec2D.x_ , y_ + secondVec2D.y_);
}
//与数值相加
Vec2D Vec2D::add(double num)
{// TODO: 在此处添加实现代码.return Vec2D(this->x_ + num , this->y_ + num);
}//加法重载函数
Vec2D Vec2D::operator +(const Vec2D& secondVec2D)
{return this->add(secondVec2D);
}
Vec2D Vec2D::operator +(const double num)
{return this->add(num);
}// 向量减法
Vec2D Vec2D::subtract(const Vec2D& secondVec2D)
{// TODO: 在此处添加实现代码.return Vec2D(x_ - secondVec2D.x_ , y_ - secondVec2D.y_);
}
// 向量减数
Vec2D Vec2D::subtract(const double num)
{// TODO: 在此处添加实现代码.return Vec2D(this->x_ - num , this->y_ - num);
}//减法重载函数
Vec2D Vec2D::operator -(const Vec2D& secondVec2D)
{return this->subtract(secondVec2D);
}
Vec2D Vec2D::operator -(const double num)
{return this->subtract(num);
}// 向量点积
double Vec2D::dot(const Vec2D& secondVec2D)
{// TODO: 在此处添加实现代码.return (x_ * secondVec2D.x_ + y_ * secondVec2D.y_);
}// 向量数乘
Vec2D Vec2D::multiply(const double multiplier)
{// TODO: 在此处添加实现代码.return Vec2D(x_ * multiplier ,y_ * multiplier);
}//乘法重载函数
Vec2D Vec2D::operator *(const double num)
{return this->multiply(num);
}
double Vec2D::operator *(const Vec2D& secondVec2D)
{return this->dot(secondVec2D);
}
//乘法友元函数,不是Vec2D的成员函数
Vec2D operator *(const double multiplier,Vec2D vec2d)
{return vec2d.multiply(multiplier);
}// 向量求负值
Vec2D Vec2D::negative()
{// TODO: 在此处添加实现代码.return Vec2D( -x_ , -y_);
}// 向量自增1
Vec2D& Vec2D::increase()
{x_++;y_++;// TODO: 在此处添加实现代码.return (*this);
}// 向量自减1
Vec2D& Vec2D::decrease()
{x_--;y_--;// TODO: 在此处添加实现代码.return (*this);
}// 求向量的范数(长度)
double Vec2D::magnitude()
{// TODO: 在此处添加实现代码.return sqrt(x_ * x_ + y_ * y_);
}// 求Vec2D与x+轴的夹角
double Vec2D::direction()
{// TODO: 在此处添加实现代码.return atan(y_ / x_);
}// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0
int Vec2D::compareTo(Vec2D secondVec2D)
{// TODO: 在此处添加实现代码.double m1 = this->magnitude();double m2 = secondVec2D.magnitude();if(abs(m1 - m2) < 1e-10)return 0;elsereturn (m1 > m2 ? 1 : -1);
}// 读取或修改向量元素
double& Vec2D::at(const int index)
{if( 0 == index)return x_;else if(1 == index)return y_;//使用异常处理的方式,抛出异常,并且打印携带信息elsethrow std::out_of_range("at() only accept 1 or 2 as parameter");// TODO: 在此处添加实现代码.// TODO: 在此处插入 return 语句
}

3、运行测试函数

#include <iostream>
#include "Vec2D.h"
using std::cout;
using std::endl;int main()
{//创建向量对象Vec2D v1{ 3,5 }, v2{ 4,6 };//向量转为字符串cout << "v1 = " << v1.toString() << endl;cout << "v2 = " << v2.toString() << endl;//向量加法: 向量 + 向量 ,向量 + 数//Vec2D v3 = v1.add(v2);//Vec2D v4 = v3.add(10.0);//使用重载operator函数Vec2D v3 = v1 + v2;Vec2D v4 = v3 + 10.0;cout << "v3 = " << v3.toString() << endl;cout << "v4 = " << v4.toString() << endl;//向量减法,向量点积,向量数乘//Vec2D v5 = v2.subtract(v1);//double v6 = v2.dot(v1);					//两个向量的点积是一个数//Vec2D v7 = v3.multiply(2.1);//使用重载operator函数Vec2D v5 = v2 - v1;double v6 = v2 * v1;					//两个向量的点积是一个数Vec2D v7 = v3 * 2.1;cout << "v2 - v1 = " << v5.toString() << endl;cout << "v2 * v1 = " << v6 << endl;cout << "v3 * 2.1 = " << v7.toString() << endl;cout << "2.1 * v3 = " << (2.1 * v3).toString() << endl;		//这里使用的是友元函数//向量求负值Vec2D v8 = v2.negative();cout << "-v2 = " << v8.toString() << endl;//向量自增/自减cout << " ++v8 = " << v8.increase().toString() << endl;cout << " --v2 = " << v2.decrease().toString() << endl;//读取或者修改向量元素cout << "v1.x_ = " << v1.at(0) << endl;cout << "v1.y_ = " << v1.at(1) << endl;//向量的长度magnitude 和角度directioncout << "v1.magnitude = " << v1.magnitude() << endl;cout << "v1.direction = " << v1.direction() << endl;//比较两个向量cout << "v1 compare v2 :" << v1.compareTo(v2) << endl;return 0;
}

4、得到测试结果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在SQL中使用DEFAULT约束

DEFAULT constraint is used to insert default value into a column on a table and if no any value is stored in any place of a column then default value will be added into it. DEFAULT约束用于将默认值插入到表的列中&#xff0c;如果列的任何位置均未存储任何值&…

(ios7) 解决代码布局View, ios7 中 subView 高度增加StatusBar20dp的问题,保证Ios6,ios7代码一致...

在ios7 布局中&#xff0c;Status Bar 和 ToolBar &#xff0c;NavigateBar 等都包含在ViewControl的主View中。 这样原来ios6 的View布局 整体向上移动了20dp&#xff0c;下面是保证ios6,ios7代码一致的解决方案 1 第一步 在项目的Info.plist 文件中 添加一行属性配置 View co…

简单的群体测试方案C++代码(Group testing against Covid-19)

原理参考链接 https://www.econstor.eu/handle/10419/221811 http://www.magigen.com/h-nd-348.html 文章原理回顾 文章比较了两种估计人群中病毒流行率的方法&#xff1a; 1、个体测试&#xff0c;即对12000人的样本进行病毒测试&#xff0c;并采用标准二项测试得出95%的置…

使用WinDbg和VMware调试NDIS中间层驱动程序 (转)

使用WinDbg和VMware调试NDIS中间层驱动程序 我这里将一步一步的介绍&#xff0c;是从新手的角度来讲的&#xff0c;所以对高手来说&#xff0c;可能有些啰嗦。如果你看完这篇文章还不知道如何设置&#xff0c;那么原因可能有两个&#xff1a;1. 我没讲好&#xff1b;2. 你需要稍…

c语言字符常量和字符串常量_C语言中的字符常量

c语言字符常量和字符串常量Any character (a single character) that is enclosed within the single quotes (like, A) is called character constants in C programming language. 用单引号引起来的任何字符(单个字符)(例如A ) 在C编程语言中称为字符常量 。 Character cons…

DDOS小测试

一、F12打开开发者工具&#xff0c;刷新待攻击的网站&#xff0c;重新获得一次请求 二、user-agent为浏览器的合法标识符 user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 是键值对的形式&…

Scrum轻松之旅_人员

Product owner产品负责人 职责&#xff1a;确定产品功能 确定产品发布日期 为产品收益率负责 根据商业价值确定功能优先级 接受或拒绝Team的开发成果 Scrum master教练 Team团队转载于:https://www.cnblogs.com/charles-x/archive/2012/06/14/2549943.html

群体测试中的假阴性影响

群体测试中的假阴性比个体测试中的假阴性风险要大得多。如果一组样本被感染&#xff0c;该组中的每个样本都可能被感染。因此&#xff0c;如果该受感染池的检测结果为假阴性&#xff0c;则该结果表明池中的每个人都没有感染。此外&#xff0c;在群体试验中混合样本会使受感染的…

融合注意力机制的YOLOv5火焰识别+Arduino UNO R3实现5s内连续识别到火焰,警报灯红灯亮起

效果&#xff1a;摄像头捕获室内图像&#xff0c;将视频实时通过串口通讯传递给改进之后的YOLOv5神经网络进行火焰识别&#xff0c;若5s内连续检测到有火焰&#xff0c;警报灯变红&#xff0c;进入危险状态。5s之内未连续出现火焰&#xff0c;警报灯变绿&#xff0c;进入安全状…

小数 ###_C#中的小数关键字

小数 ###C&#xff03;十进制关键字 (C# decimal keyword) In C#, decimal is a keyword which is used to declare a variable that can store a floating type value (value with the precision) between the range of 1.0 x 10-28 to 7.9228 x 1028. decimal keyword is an …

Moon.Orm性能报告

以下为有网友公司的评估测试及使用规范 大家可以下载word看看 http://pan.baidu.com/s/1hquvRuc 一、和ADO.NET进行的压力测试 说明&#xff1a;2000并发用户&#xff0c;此图为一网友公司对moon.orm的测评 二、和ADO.NET的性能对比测试 说明&#xff1a;同时请求10000条数据&a…

Spring中MultipartHttpServletRequest实现文件上传

转贴自&#xff1a;http://zhupan.iteye.com/blog/26427 实现图片上传   用户必须能够上传图片&#xff0c;因此需要文件上传的功能。比较常见的文件上传组件有Commons FileUpload&#xff08;http://jakarta.apache.org/commons/fileupload/a>&#xff09;和COS FileUplo…

(保守群组测试 非保守群组测试 二次重复测试 自适应二次重复测试)四种群体测试的C++代码

目录原理保守组检测非保守组检测二次重复测试自适应二次重复测试四种测试方法的核心代码保守群组测试非保守群组测试二次重复测试与自适应二次重复测试测试代码参考文献原理 假设该病在人群中的患病率&#xff08;先验概率&#xff09;为p&#xff0c;我们想用群体检验法检验N…

AngularJS中的表达式

AngularJS表达式 (AngularJS Expressions) In AngularJS, expressions are solved to give a result. It outputs the result of the expression in the html element that called it. Expressions in AngularJS contain literals, constants, operators and variables with re…

学习总结:机器学习(一)

有监督学习&#xff08;Supervised Learning&#xff09;所谓有监督学习&#xff0c;是区别于无监督学习而言的。其过程如下&#xff1a;给定一系列样本&#xff0c;样本是由一系列特征值和输出值组成。比如&#xff0c;某个地方的商品房&#xff0c;包括房子大小、房间数、距离…

Silverlight读取与设置Cookies

Silverlight读取与设置Cookies 设置Cookie DateTime expire DateTime.UtcNow TimeSpan.FromDays(30);string cookie string.Formate("{0}{1},expires{2}",key,value,expire)HtmlPage.SetProperty("cookie",cookie);读取Cookie 由于读取到的Cookie是一个…

WPS双栏格式下插入单栏图片

以一个我认识的西工大博士大佬的一篇SCI为例&#xff0c;期刊是双栏&#xff0c;图片过大&#xff0c;需要单栏进行展示&#xff0c;效果图如下&#xff1a; 一、双栏内容 二、插入单栏图像 随便敲几个字&#xff0c;选中&#xff0c; 页面布局----分栏---一栏 这行字就会…

JavaScript中的数组

Here we are discussing one of the most useful data structure, Array. 在这里&#xff0c;我们讨论最有用的数据结构之一Array 。 By conventional definition of arrays, "Arrays are the homogeneous collection of data types. But in JS, Arrays simply are the c…

【C++基础】异常处理机制概要

目录C的异常处理方法知识要点踹扔抓的代码块示例两种处理被0除的方法异常处理机制的优点其他语言中的异常处理C函数异常声明C的异常处理方法知识要点 理解“踹扔抓”三部曲的结构&#xff0c;尤其是catch是怎么匹配异常的。 知道C标准库中的异常类都是从exception继承下来的&am…

[转载]Struts2 获得Session和Request

转自http://www.blogjava.net/lyyb2001/archive/2008/03/07/184593.html 在struts1中&#xff0c;获得到系统的request或者session对象非常方便&#xff0c;都是按照形参传递的&#xff0c;但是在struts2中&#xff0c;request和session都被隐藏了struts提供两种方式访问sessio…