C ++将对象传递给成员函数

时间:2013-12-09 01:55:44

标签: c++ function object parameters member

对于家庭作业,我们被要求创建两个类: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;的目的是什么?服务?

最重要的是,我如何编写我的代码以完全遵循指令的状态?

感谢阅读并感谢任何人可能提出的任何建议。

1 个答案:

答案 0 :(得分:3)

如果您生活在没有const个对象的世界中,那么标记方法const永远不会必要。但是,这是一个好主意。当您不需要更改对象的成员时,使用const指针和引用是一种非常好的做法,它可以帮助您在程序变大时找到设计缺陷。

传递对象的引用也是一种很好的做法,因为传递引用通常比传递对象的副本更快。 (在这种情况下你也会使用const引用:它告诉调用者你想要引用对象,因为它更快,而不是因为你想要改变它。)

省略参数名称是合法的,但它有明显的后果,你将无法在你的函数中使用它们。这也是一种常见的表示法,因为编译器在创建函数签名时会删除参数名称,因此您经常会看到类似distance(const MyPoint&)而不是distance(const MyPoint& point)的错误消息。

我无法帮助你为什么他们想要一个const MyPoint&的ThreeDPoint类。我最好的猜测是他们希望你假设该点的z分量是0。