首页 > 其他分享 >第11章 使用类——再谈重载:矢量类(二)

第11章 使用类——再谈重载:矢量类(二)

时间:2024-04-07 22:24:00浏览次数:28  
标签:11 set 再谈 运算符 operator Vector 使用 重载

本文章是作者根据史蒂芬·普拉达所著的《C++ Primer Plus》而整理出的读书笔记,如果您在浏览过程中发现了什么错误,烦请告知。另外,此书由浅入深,非常适合有C语言基础的人学习,感兴趣的朋友可以自行阅读此书籍。

上节我们实现了个矢量类,这节我们主要对其中使用的C++技术做些说明。

矢量类的说明

使用状态成员

Vector类储存了矢量的直角坐标和极坐标。它使用名为mode的成员来控制使用的构造函数、reset()方法和重载的operator<<()函数使用哪种形式,其中枚举RECT表示直角坐标模式、POL表示极坐标模式。这样的成员被称为状态成员,因为这种成员描述的是对象所处的状态。

以构造函数为例:

Vector::Vector(double n1, double n2, Mode form)
{
  mode = form;
  if(form == RECT)
  {
    x = n1;
    y = n2;
    set_mag();
    set_ang();
  }
  else if (form == POL)
  {
    mag = n1;
    ang = n2 / Rad_to_deg;
    set_x();
    set_y();
  }
  else{
    cout << "Incorrect 3rd argument to Vector() --";
    cout << "vector set to 0\n";
    x = y = mag = ang = 0.0;
    mode = RECT;
  }
}

如果第三个参数是RECT或省略了,则将输入解释为直角坐标;如果为POL,则将解释为极坐标。
我们可以在main函数中,使用VECTOR::vector::RECT或者VECTOR::vector::POL来决定输入参数的含义。枚举类型定义在公有部分,因此可以使用如下的语句来创建对象:

Vector foolery(20.0, 30.0, VECTOR::Vector::POL);

为Vector类重载算数运算符

我们在Vector类中重载了两次operator-(),那是因为,在C++中,-运算符已经有两种含义。首先,使用两个操作数,它是减法运算符。减法运算符是一个二元运算符,因为它有两个操作数。其次,使用一个操作数时(如-x),它时负号运算符。这种形式被称为一元运算符。

首先是第一个,减法运算符重载:

Vector Vector::operator-(const Vector& b) const
{
  return Vector(x - b.x, y - b.y);
}

对于直角坐标而言,将x、y分量分别相减即可。

再看第二个,负号运算符重载:

Vector Vector::operator-() const
{
  return Vector(-x, -y);
}

它只使用了一个操作数,假设为:

Vector vc(30.0, 40.0);

则取负号后为

(-30.0,-40.0),

函数重载指的是函数名称相同,特征标不同(参数列表不同)的函数。operator-()有两种不同的定义,是因为它们的特征标不同。需要注意的是,对于只有二元形式的运算符(如除法运算符),只能将其重载为二元运算符。

标签:11,set,再谈,运算符,operator,Vector,使用,重载
From: https://www.cnblogs.com/superbmc/p/18117958

相关文章

  • Hetao P1178 冒险者 题解 [ 绿 ][ 最短路 ][ 线性 dp ]
    原题题解本蒟蒻采用的和大部分人解法不同,是根据当前标记值的总和跑最短路的一种解法。思路30min,调代码2h的我太蒻了首先观察题面可以发现本题求的是最少操作数,由于要求最小且有变化的过程,所以可以使用dp求解,也可以使用最短路算法求解,本篇先介绍最短路的算法。其实......
  • 全国地级市-碳排放绩效原始dofile结果数据(含文献及原始数据)2011-2021年
    地级市-碳排放绩效数据的测算,采用GDP、人类发展指数、CO2排放测算碳排放绩效,基于《中国城市统计年鉴》中的数据,经过线性插值和ARIMA方法填补缺失,跨度2011年至2021年。该数据集详细记录了地级市的总碳排放量,但需注意,2008年以前的常住人口和城市化率数据缺失,1999年以前的总碳排放......
  • Android11 - 添加自定义服务注意事项
    添加自定义服务注意事项:a:(Android11)快速编译framework.jar./prebuilts/build-tools/linux-x86/bin/ninja-fout/combined-xx.ninjaframework-minus-apexb:在framework/base/core目录下添加文件java和aidl文件后,编译时需要先makeupdate-api去更新current.txt文件,然后才能......
  • C语言游戏实战(11):贪吃蛇大作战(多人对战)
         成果展示:贪吃蛇(多人对战) 前言:这款贪吃蛇大作战是一款多人游戏,玩家需要控制一条蛇在地图上移动,吞噬其他蛇或者食物来增大自己的蛇身长度和宽度。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。在开始编写代码之前,我们需要先......
  • 肖sir__接口测试之postman11.1
    接口测试之postman一、介绍postmanPostman是一个网页调试工具,也可以调试css、html等Postman的操作环境环境:Postman Mac、Windows X32、Windows X64、Linux系统、postman 浏览器扩展程序、postman chrome应用程序Postman下载:https://www.postman.com/downloads/  记得......
  • CentOS 安装OpenJDK 11
    安装OpenJDK11sudoyuminstalljava-11-openjdk-devel   2.确认Java版本java-version   3.配置JAVA_HOME环境变量update-alternatives--configjava在输出的结果中,你会看到Java的安装路径,然后配置环境变量,如下:sudovi/etc/profile在文件的末尾,添加以......
  • C++:重载符operator
    我们可以在类中使用重载符进行符号功能重载<返回类型>operator<重载的符号>(形参){//function} 下面重载一个符号"≥"classMyClass{public:inta;charb;public:MyClass();~MyClass();intoperator>=(MyClassA){......
  • C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair
    C++Primer(第5版)练习11.14练习11.14扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。环境:LinuxUbuntu(云服务器)工具:vim 代码块/************************************************************************* >Fil......
  • 【CSP】202112-2 序列查询新解
    题目大意:给定一长度为n+1的严格单增数列A[a0,a1,a2,a3...,an],其中a0=0,an<N定义f(x)为数列A中小于等于x的最大整数的下标,r=floor(N/(n+1)),g(x)=floor(x/r)。当N<1e9,n<1e4的时候,求解|g(x)-f(x)|之和,x=0,1,2...,N-1 分析:数据规模较大,如果一项一项求和将会超时。为优化朴素方法,观......
  • 11.java openCV4.x 入门- Imgcodecs之图像读写
    专栏简介......