重载运算符 [] C++

Overloading Operator[] in C++

本文关键字:C++ 运算符 重载      更新时间:2023-10-16

无论出于何种原因,在main():className[index]= 2中编码。 触发 className 的构造函数,而不是编码重载方法,其中右手操作数作为参数传递(在本例中为 2)。需要您澄清的模糊行为。为什么忽略方法运算符 [] ?

下面是动态数组类的示例:

class dTableau
{
public:
    dTableau(int taille);
    int& operator  [](int index) ;
    dTableau &operator =(int val);
    // other methods
private:
    int *m_tab;
    int m_taille;
};

dTableau::dTableau(int taille)
{
    m_taille = taille;
    m_tab = new int[taille];
    for (int cnt = 0; cnt < m_taille;cnt++) {
        m_tab[cnt] = cnt;
    }
}
int& dTableau::operator[](const int index) {
    return m_tab[index];
}
 void main(){
     int taille=2;
     dTableau *t = new dTableau(taille);
     // this line triggers the constructor with 1 as parameter 
     t[1]=1;
}

C++只会在其中一个操作数为类类型时尝试应用重载运算符。看看这段代码:

 dTableau *t = new dTableau(taille);
 t[1] = 1;

在这里,变量t是指向dTableau指针,而不是诚实善良dTableau对象。结果,该行

t[1] = 1;

被解释为"访问t指针指向的索引 1 处的元素,然后为其分配值 1"。然后,这将导致转换构造函数用于将右侧的 1 转换为dTableau,然后最终将其分配给 t 数组中 1 的(无效)数组索引处的(不存在的)对象。

由于t是一个指针,如果要使用重载的选择运算符,则需要首先引用它:

(*t)[1] = 1;

或者,如果t不需要是指针,请不要这样声明它:

dTableau t(taille);
t[1] = 1;