Рубрики

Почему аргумент конструктора копирования должен быть константным в C ++?

Когда мы создаем наш собственный конструктор копирования, мы передаем объект по ссылке и обычно передаем его как константную ссылку.
Одной из причин передачи ссылки на const является то, что мы должны использовать const в C ++ везде, где это возможно, чтобы объекты не были случайно изменены. Это одна из веских причин для передачи ссылки на const, но это еще не все. Например, предсказать вывод следующей программы на C ++. Предположим, что удаление копии не выполняется компилятором.

#include<iostream>

using namespace std;

  

class Test

{

   / * Класс данных членов * / 

public:

   Test(Test &t) { / * Копировать данные членов из t * /}

   Test()        { / * Инициализировать данные членов * / }

};

  
Test fun()
{

    cout << "fun() Called\n";

    Test t;

    return t;

}

  

int main()

{

    Test t1;

    Test t2 = fun();

    return 0;

}

Выход:

 Compiler Error in line "Test t2 = fun();" 

Программа выглядит хорошо на первый взгляд, но она имеет ошибку компилятора. Если мы добавим const в конструктор копирования, программа будет работать нормально, т. Е. Мы изменим конструктор копирования на следующий.

Test(const Test &t) { cout << "Copy Constructor Called\n"; }

Или, если мы изменим строку «Test t2 = fun ();» на две следующие строки, программа также будет работать нормально.

Test t2; 
t2 = fun();

Функция fun () возвращает значение. Таким образом, компилятор создает временный объект, который копируется в t2 с использованием конструктора копирования в исходной программе (временный объект передается в качестве аргумента конструктору копирования). Причина ошибки компилятора заключается в том, что созданные временным объектом компилятор не может быть привязан к неконстантным ссылкам, и исходная программа пытается это сделать. Не имеет смысла модифицировать временные объекты, созданные компилятором, так как они могут умереть в любой момент.

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

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

Почему аргумент конструктора копирования должен быть константным в C ++?

0.00 (0%) 0 votes