对于家庭作业,我们被要求创建两个类:MyPoint类和ThreeDPoint类。
这是我的MyPoint课程:
#pragma once
#include <math.h>
class MyPoint
{
private:
double x, y;
public:
MyPoint()
{
x = y = 0;
}
MyPoint(double x, double y)
{
this->x = x;
this->y = y;
}
double getX()
{
return x;
}
double getY()
{
return y;
}
double distance(MyPoint pointB)
{
return sqrt((x - pointB.x) * (x - pointB.x)
+ (y - pointB.y) * (y - pointB.y));
}
};
这是我的ThreeDPoint课程:
#pragma once
#include "MyPoint.h"
class ThreeDPoint : public MyPoint
{
private:
double z;
public:
ThreeDPoint() // : MyPoint()
{
z = 0;
}
ThreeDPoint(double x, double y, double z) : MyPoint(x, y)
{
this->z = z;
}
double getZ()
{
return z;
}
double distance(ThreeDPoint pointB) // function overloading
{
// x and y are private not protected
return sqrt((getX() - pointB.getX()) * (getX() - pointB.getX())
+ (getY() - pointB.getY()) * (getY() - pointB.getY())
+ (getZ() - pointB.getZ()) * (getZ() - pointB.getZ()));
}
};
主要是:
#include <iostream>
#include "SignatureBlock.h"
#include "MyPoint.h"
#include "ThreeDPoint.h"
int main()
{
SignatureBlock myBlock;
std::cout << myBlock.toString();
MyPoint pointA(1, 2);
MyPoint pointB(4, 2.5);
std::cout << pointA.distance(pointB) << '\n';
ThreeDPoint point_a(0, 0, 0);
ThreeDPoint point_b(10, 30, 25.5);
std::cout << point_a.distance(point_b) << '\n';
return 0;
}
此代码工作正常。它能够计算二维和三维空间中两点之间的距离。但是,在ThreeDPoint类的作业指导中,该书说要创建
“返回z值的常量get函数”
和
“常量distance(const MyPoint&)
函数,用于返回此点与三维空间中另一个点之间的距离。”
我的问题是“常量获取函数......”和“常量距离(常量MyPoint&amp;)函数......”是什么意思?我知道您可以在函数声明之后放置const
以防止函数更改任何类成员,但为什么这里需要它?
另外,为什么我会将const MyPoint&
传递给距离函数而不是ThreeDPoint对象?毕竟我们试图找到两个ThreeDPoints之间的距离。我读到如果你在成员函数声明中有一个父对象参数,那么父父的任何子节点也可以传递给该函数,所以这可能与它有关。
最后,指示中的distance(const MyPoint&)
不是缺少MyPoint&amp;的名称。宾语?我确实尝试输入这个并且编译器不介意,但是我如何访问传入的对象的成员?
编辑:此外,&amp;的目的是什么?服务?
最重要的是,我如何编写我的代码以完全遵循指令的状态?
感谢阅读并感谢任何人可能提出的任何建议。
答案 0 :(得分:3)
如果您生活在没有const
个对象的世界中,那么标记方法const
永远不会必要。但是,这是一个好主意。当您不需要更改对象的成员时,使用const
指针和引用是一种非常好的做法,它可以帮助您在程序变大时找到设计缺陷。
传递对象的引用也是一种很好的做法,因为传递引用通常比传递对象的副本更快。 (在这种情况下你也会使用const
引用:它告诉调用者你想要引用对象,因为它更快,而不是因为你想要改变它。)
省略参数名称是合法的,但它有明显的后果,你将无法在你的函数中使用它们。这也是一种常见的表示法,因为编译器在创建函数签名时会删除参数名称,因此您经常会看到类似distance(const MyPoint&)
而不是distance(const MyPoint& point)
的错误消息。
我无法帮助你为什么他们想要一个const MyPoint&
的ThreeDPoint类。我最好的猜测是他们希望你假设该点的z
分量是0。