运算符overload =和const引用

Pel*_*a86 0 c++ const operator-overloading

我正在尝试用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)
}
Run Code Online (Sandbox Code Playgroud)

--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;
}
Run Code Online (Sandbox Code Playgroud)

像这样它工作正常,但我听说必须放一个const来避免因为错误,对象将被分配操作修改,所以必须将另一个对象声明为const.像这样:

Color& operator =(Color const& other_color); //(2)
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误:

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

所以这是我的问题......

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

PS.:小问题:
我想将我的变量传递给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;
}
Run Code Online (Sandbox Code Playgroud)

将无法正常工作,因为rgba将在返回后不再在范围内,因此它将被删除,我的指针将指向未初始化的地址,该死的......

jpa*_*cek 5

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

这意味着你必须进一步.get_r可能被宣布为

float get_r()
Run Code Online (Sandbox Code Playgroud)

并使其工作(const-correct),你应该做到

float get_r() const
Run Code Online (Sandbox Code Playgroud)

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

您将无法从const-qualified Colors 分配.您通常希望能够使用const对象,以及作为赋值的来源.而且,它的目的是不向代码的读者清楚地修改源.

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

返回一个包含数组并自动转换为的特殊"车辆" 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;
}
Run Code Online (Sandbox Code Playgroud)