Podwójne przeładowanie operatora []

0

Cześć,
w pewnym kodzie znalazłem taki zapis:

    float& operator[](const int index);
    const float& operator[](const int index) const;

Czy może mi ktoś wyjaśnić w jakim celu jest zdublowane przeładowanie operatora? Różnica jest tylko w dodaniu const... Dlaczego kompilator nie wywala błędu przy takim zapisie?

Z góry dziękuję za pomoc.

1

Znalazłem tylko to 😔

1
Kofcio napisał(a):

Cześć,
w pewnym kodzie znalazłem taki zapis:

    float& operator[](const int index);
    const float& operator[](const int index) const;

Czy może mi ktoś wyjaśnić w jakim celu jest zdublowane przeładowanie operatora? Różnica jest tylko w dodaniu const... Dlaczego kompilator nie wywala błędu przy takim zapisie?

Z góry dziękuję za pomoc.

Nie wywala błędu bo to są 2 różne funkcje. A jaki cel to miało, bez implementacji trudno powiedzieć precyzyjnie, jednak po samej deklaracji patrząc zapewne zaszła potrzeba obsługiwania instancji klasy zdefiniowanych jako const. Aczkolwiek o ile operator bez const nie działa inaczej niż ten z const, to starczyło dać definicję tylko tego z const.

1

@MasterBLB: Jak to dwie różne? Typ zwracany nie należy do sygnatury funkcji. Wtedy jedyną różnicą mógłby być const zabraniający modyfikacji pól.

1

Zobacz przykład:

template< int dim >
class Foo
{

public:

    Foo() { tab.resize(abs(dim),0); iota(tab.begin(), tab.end(),1); }
    float& operator[]( size_t index ) { return tab[index%abs(dim)]; }            // (1)
    const float operator[]( size_t index ) const { return tab[index%abs(dim)]; } // (2)

private:

    vector<float> tab;
};

............

Foo<100> foo1;
const Foo<100> foo2;

cout << "using (1) overload " << foo1[12] << "\n";
cout << "using (2) overload " << foo2[25] << "\n";

W przypadku kiedy usuniemy (2) to pozbawimy się możliwości używania operatora [] dla obiektów typu const.

3

Dla tego, że pierwsza funkcja jest odpalana na obiektach mutowalnych a druga na obiektach tylko const (o czym mówi const za nagłówkiem funkcji).

3

Właśnie o const chodzi, to powoduje, że dla kompilatora:

void f1();
void f1() const;

są to różne funkcje. A poniżej przykład działania:

#include <iostream>

using namespace std;

class AClass
{
public:
    void f1()
    {
        cout << "f1()\n";
    }
    
    void f1() const
    {
        cout << "f1() const\n";
    }
};

int main()
{
    AClass nonConst;
    const AClass isConst;
    
    nonConst.f1();
    isConst.f1();

    return 0;
}

https://onlinegdb.com/rJGgJwD1r

0

Dziękuję wszystkim za pomoc. Już wszystko rozumiem :-).

1 użytkowników online, w tym zalogowanych: 0, gości: 1