Cтраница 2
Тестер для проверки класса String ( часть 5 из 7. [16] |
Конструктор копии работает аналогично конструктору преобразования за исключением того, что он просто копирует элемент length из исходного объекта класса String в объект-копию String. Обратите внимание, что конструктор копии заново выделяет память для внутренней строки символов объекта-копии. Если бы он просто скопировал sPtr из исходного объекта в sPtr объекта-копии, то оба объекта указывали бы на ту же самую область памяти. При первом вызове деструктора динамически выделенная память была бы очищена и sPtr другого объекта стал бы неопределенным. [17]
Важное преимущество, которое дает создание конструкторов преобразования, состоит в применении перегруженных операторов, определенных для класса, и в том, что пропадает необходимость в написании отдельной функции-оператора для каждой ожидаемой комбинации операндов. [18]
Одной их замечательных возможностей операций приведения и конструкторов преобразования является то, что при необходимости компилятор может автоматически вызывать эти функции, чтобы создавать временные объекты. [19]
Одной из приятных особенностей операций приведения и конструкторов преобразований является то, что при необходимости компилятор может вызывать эти функции автоматически для создания временных объектов. [20]
Кроме того, так как теперь CCurrency имеет конструктор преобразования с параметром типа double, единственная функция-оператор может обрабатывать значения с плавающей запятой. [21]
Во втором и третьем выражениях компилятор сначала преобразовывает константу типа long в объект CCurrency, используя соответствующий конструктор преобразования, а затем вызывает дружественную функцию-оператор для сложения двух объектов. [22]
Помимо использования конструктора преобразования при явном создании объекта класса и инициализации его единственным значением другого типа, компилятор также вызывает соответствующий конструктор преобразования для преобразования переменной-члена какого-либо другого типа в объект класса. Другими словами, конструктор преобразования указывает компилятору, как преобразовывать объекты или переменные различных типов в объект данного класса. [23]
И в первом, и во втором присваивании компилятор в первую очередь преобразовывает константу в объект класса CCurrency, используя соответствующий конструктор преобразования, а затем присваивает его объекту Bucks класса CCurrency. Символ L во втором операторе присваивания необходим для исключения неоднозначного вызова конструктора преобразования. [24]
Первый элемент ( Money-Table [0]) инициализируется существующим объектом класса CCurrency с помощью конструктора копирования; второй - инициализируется конструктором, создающим временный объект класса Ccurrency ( затем данный объект используется для инициализации элемента массива также конструктором копирования); третий - инициализируется константой типа long с помощью конструктора преобразования с параметром типа long; четвертый - константой типа double с помощью другого конструктора преобразования. Последний элемент массива инициализируется неявно; следовательно, для него компилятор вызывает конструктор по умолчанию. [25]
Помимо использования конструктора преобразования при явном создании объекта класса и инициализации его единственным значением другого типа, компилятор также вызывает соответствующий конструктор преобразования для преобразования переменной-члена какого-либо другого типа в объект класса. Другими словами, конструктор преобразования указывает компилятору, как преобразовывать объекты или переменные различных типов в объект данного класса. [26]
Наличие такого конструктора преобразования означает, что нет необходимости предусматривать специальную операцию присваивания для присвоения объекту String строки символов. Компилятор автоматически вызывает конструктор преобразования, чтобы создать временный объект String, содержащий указанную строку. После этого вызывается перегруженная операция присваивания, чтобы присвоить временный объект String другому объекту String. Обратите внимание, что когда C использует конструктор преобразования таким образом, он может применить лишь один конструктор, чтобы попробовать удовлетворить потребности перегруженной операции присваивания. Наоборот, невозможно реализовать такое присваивание посредством выполнения ряда неявных преобразований, определенных пользователем. Конструктор преобразования вычисляет длину строки символов и присваивает это значение закрытому элементу данных length; использует new, чтобы присвоить указатель на выделенную под строку память закрытому элементу данных sPtr; вызывает assert для проверки успешности вызова new и, если память выделена, вызывает strcpy, чтобы скопировать строку символов в объект. [27]
И в первом, и во втором присваивании компилятор в первую очередь преобразовывает константу в объект класса CCurrency, используя соответствующий конструктор преобразования, а затем присваивает его объекту Bucks класса CCurrency. Символ L во втором операторе присваивания необходим для исключения неоднозначного вызова конструктора преобразования. [28]
Операция присваивания - наиболее часто перегружаемая операция. Обычно она используется для присваивания одного объекта другому объекту того же класса, но, посредством использования конструктора преобразования, она также может применяться в качестве операции присваивания объектов различных классов. [29]
Этот конструктор берет аргумент char ( это по умолчанию пустая строка) и создает объект String, который включает эту строку символов. Конструктор преобразования преобразует соответствующую строку в объект String, который затем присваивается объекту-адресату String. Наличие этого конструктора преобразования означает, что нет необходимости применять перегруженную операцию специально для присваивания строк символов объектам String. Компилятор автоматически активизирует конструктор преобразования для создания временного объекта String, содержащего строку символов. [30]