一个常数的副本?

时间:2015-10-23 19:15:54

标签: c++ const

Polynomial operator + (const Polynomial& p);
//Adds existing Polynomial to p, returning the result

因为我们不能改变const的值,有没有办法制作这个p的副本以允许我访问p的函数?

对不起工作的人并且完全显示整个程序,但在私人领域的Poly.H中它显示: 私人的: 列表<术语>聚

所以在PolyTest.cpp中

如果我需要两个多项式 p_add = poly1 + poly2

我需要在operator +中编写函数来添加类似的术语。希望这有用。

4 个答案:

答案 0 :(得分:6)

如果您需要复制,只需将其复制到函数

Polynomial operator + (const Polynomial& p);
{
    Polynomial copy = p;
    // do stuff
}

现在只是因为p const并不意味着您无法使用其成员/功能。典型的operator+看起来像

Something operator + (const Something& s);
{
    return Something(this->some_memeber + s.some_memeber,
        this->another_memeber + s.another_memeber);
}

答案 1 :(得分:3)

如果您需要operator+内的副本,最简单的方法是将p传递给(const)值:

Polynomial operator+ (Polynomial p);

现在p是您传递的对象的副本,您可以在operator+内陷入困境。当然,如果您通过const值,如

Polynomial operator+(const Polynomial p);

然后副本本身将为const,因此您只能访问其const成员函数。

正如评论中所提到的,有时会通过const引用并确保您只访问const成员函数是您实际需要的,因为您可以避免使用其他副本。然而,有些情况下需要复制(很可能不在这里),例如在实现着名的copy-and-swap idiom时,在这种情况下,按值传递对象是要走的路,以及实现最简单的方法期望的效果。

答案 2 :(得分:1)

从它的声音来看,你在const的某些成员函数上缺少一个Polynomial说明符,例如,你可能有:

// Can modify *this.
std::vector<double> coefficients() { … }

当您需要时:

// Cannot modify *this.
std::vector<double> coefficients() const { … }

添加const说明符会将成员函数中this的类型从Polynomial*更改为const Polynomial*。在const引用上,您只能调用const个成员函数。 (您仍然可以在非const引用上调用const成员函数。)

答案 3 :(得分:0)

编辑: 您可能正在引用成员函数末尾的const说明符,如下所示:

class Test
    // cannot modify members of Test
    void test() const;
    // can modify members of Test
    void test2();
};

在const对象上操作时,最后只能调用声明为const的方法。

如果您需要修改const成员函数内的成员(通常不是这种情况),您可以将其声明为mutable

多项式前面的const说明符&amp; p表示它是多项式的const引用,因此您无法修改p的值。 我与访问功能无关。如果在您的类中声明了该方法,则可以访问同一类中的所有方法。

然而,您可以制作一个简单的副本来处理副本,但不是对输入参数的引用:

Polynominal p2(p);

Polynominal p3 = p;