c ++覆盖+ =带const引用

时间:2016-12-05 12:52:46

标签: c++ const

对于一个项目,我正在尝试使用矢量函数创建一个矢量类。我试图通过覆盖+ =加法赋值来添加向量加法函数。因为我不希望+ =函数更改要添加的值我想将该值作为#pragma once class Vector2D { private: int m_x, m_y; public: Vector2D(int x, int y); int getX(); int getY(); void setX(int x); void setY(int y); Vector2D& operator+=(const Vector2D&); }; 传递。

我的代码:

Vector2D.h

#include "Vector2D.h"
Vector2D::Vector2D(int x, int y)
{
    m_x = x;
    m_y = y;
}

int Vector2D::getX()
{
    return m_x;
}

int Vector2D::getY()
{
    return m_y;
}

void Vector2D::setX(int x)
{
    m_x = x;
}

void Vector2D::setY(int y)
{
    m_y = y;
}

Vector2D& Vector2D::operator+=(const Vector2D& toAdd)
{
    m_x += toAdd.getX();
    m_y += toAdd.getY();
    return *this;
}

Vector2D.cpp

const

但是我得到了错误:

  

该对象具有与该成员不兼容的类型限定符   功能“Vector2D :: getX”

  

int Vector2D :: getX(void)':无法从'const转换'this'指针   Vector2D'到'Vector2D&'

我尝试将返回x和y的函数链接到const int Vector2D::getX() const int Vector2D::getY()

const

但这不会解决错误。从参数中删除exit可以解决所有错误并导致工作代码。

我应该如何更改代码以确保传递给+ =运算符的值不能更改(例如通过调用传递的对象上的setY(100))?

3 个答案:

答案 0 :(得分:6)

也可以Vector2D::getX() const。否则,您无法通过const引用在对象上调用它。

您添加const的尝试已应用于函数返回值,而不是this指针

const int Vector2D::getX()

const对象上的函数是否返回const int

int Vector2D::getX() const 

const对象上的函数。

这就是人们经常说“领先的const具有误导性”的原因之一。

答案 1 :(得分:4)

getX()getY()是非const成员函数,不能使用const对象调用。由于他们不会修改班级Vector2D的任何成员,因此您应将其标记为const member function,例如

int Vector2D::getX() const 

注意const的位置,它应放在函数声明的末尾,表示该函数不会修改该类的任何成员(可变成员除外)。 const int Vector2D::getX()表示函数将返回一个常量,它与成员函数的特性无关。实际上,返回一个常量内置类型并没有多大意义,从调用者方面来看,它没有任何区别。

答案 2 :(得分:0)

您正在寻找的是:常数成员函数

int Vector2D::getX() const 

函数声明中的参数列表之后的const 表示该函数不会修改对象的状态。

可以为const和非const对象调用const成员函数,而非const成员函数只能为非const对象调用

在您的情况下,toAdd是常量。