操作符重载=和const引用

Operator overload = and const reference

本文关键字:const 引用 重载 操作符      更新时间:2023-10-16

我试图在c++中构建一个颜色类,
这不是作业,只是我还在纠结于引用和const。

——Color.h

class Color{
private:
    double r;
    double g;
    double b;
    double a;
public:
    //constructor, getters and setters...
    Color& operator =(Color& other_color); //(1)
}

——Color.cpp

Color& operator=(Color& other_color){
     this->r = other_color.get_r(); //line 41
     this->b = other_color.get_b();
     //and so on...
     return *this;
}
像这样的

,它工作得很好,但我听说必须放一个const,以避免错误的对象将被赋值操作修改,所以必须声明另一个对象为const。这样的:

Color& operator =(Color const& other_color); //(2)

但是它给了我这个错误:

/Users/../color.cpp:41: error: passing 'const Color' as 'this' argument of 'float Color::get_r()' discards qualifiers

我的问题是…

这里发生了什么?第二,如果我不声明other_color为const,会发生什么?可能的错误是什么?

p。小问题:
我想把变量传递给opengl glColor4v(colorx.return_rgba()),返回类Color的数组[r,g,b,a]。:

float* Color::return_rgba(){
    float  rgba[4] = {this->r, this->g, this->b, this->a};
    return rgba;
}

不起作用因为rgba在返回后不再在作用域内所以它将被删除我的指针将指向未初始化的地址,该死的。

将'const Color'作为'float Color::get_r()'的'this'参数传递将放弃限定符

这意味着你必须更进一步。get_r可能声明为

float get_r()

,并且要使它工作(const正确),您应该将其设置为

float get_r() const

第二,如果我不声明other_color为const会发生什么?

您将无法从const合格的Color s分配。您通常希望能够使用const对象,以及其他作为赋值源的对象。此外,它使不修改源代码的意图对代码的读者清楚。

我想把我的变量传递给opengl glColor4v(colorx.return_rgba()),返回类Color的数组[r,g,b,a]。

返回一个特殊的"vehicle",它将包含数组并自动转换为float*。一些

struct ColorQuadruplet
{
  float data_[4];
  // add initialization and such here
  operator float*() { return data_; }
};
ColorQuadruplet Color::get_rgba() const
{
  ColorQuadruplet ret;
  // fill ret
  return ret;
}

您有两个选择。一种是让operator=直接访问源对象的成员:

Color &operator=(Color const &other) { 
    r = other.r;
    g = other.g;
    b = other.b;
    a = other.a;
}

另一种方法(如果您坚持要为颜色组件提供访问器,那么您可能在任何情况下都想这样做)是对您编写的访问器进行const限定:

double get_r() const { return r; }
               ^^^^^

这里的const是我添加的部分,你显然没有。

编辑:至于将值传递给glColor,我会考虑像这样的小前端:

gl_color(Color const &c) { 
    glColor4d(c.r, c.g, c.b, c.a);
}