Аргумент копирующего конструктора...223

We use cookies. Read the Privacy and Cookie Policy

Использование копирующего конструктора для создания временных объектов и копий объектов вызывает один интересный вопрос. Рассмотрим очередной пример.

    class Student

    {

    public :

        Student( Student s )

        {

            /* ...всё, что угодно... */

        }

    } ;

    void fn( Student fs )

    {

    }

    int main ( int argcs , char* pArgs[ ] )

    {

        Student ms ;

        fn( ms ) ;

        return 0 ;

    }

И в самом деле, почему бы не объявить копирующий конструктор класса Student как Student::Student( Student ) ? Однако такое объявление попросту невозможно! При попытке скомпилировать программу с таким объявлением вы получите сообщение об ошибке; Dev-C++ сообщит примерно следующее:

invalid constructor; you probably meant ' Student ( const Student& )'

Давайте подумаем, почему аргумент конструктора обязательно должен быть ссылкой? Представим, что ограничений на тип аргумента копирующего конструктора нет. В этом случае, когда main( ) вызовет функцию fn( ), компилятор С++ использует копирующий конструктор для создания копии объекта класса Student. При этом копирующий конструктор, получая объект по значению, требует вызова копирующего конструктора для создания копии объекта класса Student. И так до полного исчерпания памяти и аварийного останова...

_________________

223 стр. Глава 18. Копирующий конструктор