Рубрики

Оператор назначения по умолчанию и ссылки

Мы обсудили перегрузку оператора присваивания для динамически распределяемых ресурсов здесь . Это продолжение предыдущего поста. В предыдущем посте мы обсуждали, что когда мы не пишем свой собственный оператор присваивания, созданный компилятором оператор присваивания делает поверхностное копирование, и это вызывает проблемы. Что происходит, когда у нас есть ссылки в нашем классе и нет определенного пользователем оператора присваивания. Например, предсказать вывод следующей программы.

#include<iostream>

using namespace std;

   

class Test

{

    int x;

    int &ref;

public:

    Test (int i):x(i), ref(x) {}

    void print() { cout << ref; }

    void setX(int i) { x = i; }    

};

   

int main()

{

    Test t1(10);

    Test t2(20);

    t2 = t1;

    t1.setX(40);

    t2.print();

    return 0;

}

Выход:

Compiler Error: non-static reference member 'int& Test::ref', 
             can't use default assignment operator

Компилятор не создает оператор присваивания по умолчанию в следующих случаях

1. Класс имеет нестатический член данных типа const или ссылочного типа.
2. Класс имеет нестатический элемент данных типа, который имеет недоступный оператор присваивания копии
3. Класс является производным от базового класса с недоступным оператором присваивания копии

Когда любое из вышеприведенных условий выполняется, пользователь должен определить оператор присваивания. Например, если мы добавим оператор присваивания в приведенный выше код, код будет работать без ошибок.

#include<iostream>

using namespace std;

   

class Test

{

    int x;

    int &ref;

public:

    Test (int i):x(i), ref(x) {}

    void print() { cout << ref; }

    void setX(int i) { x = i; }    

    Test &operator = (const Test &t) { x = t.x; return *this; } 

};

   

int main()

{

    Test t1(10);

    Test t2(20);

    t2 = t1;

    t1.setX(40);

    t2.print();

    return 0;

}

Выход:

10

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Оператор назначения по умолчанию и ссылки

0.00 (0%) 0 votes