如何在const成员函数中使用非const成员函数?

时间:2016-05-26 08:10:10

标签: c++ const

以下是一个简单的C ++结构和一个3D矢量和3x3矩阵的类。正如您所看到的那样,下标运算符对它们都是重载的。我返回对其中数据成员的引用,以便能够分配给vec[0] = 5.0;mat[0] = vec3(2.0);mat[0][0] = 3.0;等成员。现在我为{{1}声明了另一个运算符},加号(+)运算符,不应修改矩阵本身,但应返回一个新矩阵作为和。如何将此非修改+运算符设为mat3

矢量

const

矩阵

struct vec3 {
    typedef double value_type;
    vec3::value_type x, y, z;

    vec3(const vec3::value_type x,
         const vec3::value_type y,
         const vec3::value_type z)
    : x{x}, y{y}, z{z} {}

    vec3(const vec3::value_type w)
    : vec3(w, w, w) {}

    vec3()
    : vec3(0.0) {}

    // this works because [] operator is not used
    vec3 operator+(const vec3& v) const {
        return vec3(this->x + v.x, this->y + v.y, this->z + v.z);
    }

    vec3::value_type& operator[](const std::size_t index) {
        switch(index) {
        case 0:
            return x;
        case 1:
            return y;
        case 2:
            return z;
        default:
            throw std::invalid_argument("vec3 supports upto 3(0-2) elements");
        }
    }
};

1 个答案:

答案 0 :(得分:7)

您可以(并且应该)为operator[]添加const版本,然后您可以使operator+ const,operator[]的const版本将在其中调用。

vec3& operator[](const std::size_t index) {
    ...
}
const vec3& operator[](const std::size_t index) const {
~~~~~                                           ~~~~~
    ...
}

请注意,您可以重载const和非const成员函数。

https://ant.apache.org/manual/Tasks/exec.html(强调我的)

  

可以使用constvolatile声明非静态成员函数,   或const volatile限定符(此限定符出现在名称后面。)   函数声明中的函数)。 不同的cv资格   函数有不同的类型,因此可能会相互重载。

     

在cv限定函数的主体中,this指针是   符合条件的,例如,在const成员函数中,只有其他const成员   函数可以正常调用。 (非const成员函数可以   如果应用const_cast或通过访问路径仍然会被调用   这不涉及this。)