}
60: const char*GetStringO
{
return Buffer;
}
};
65:
void UseMyString(MyString Input)
{
cout « "String buffer in MyString is " « Input.GetLength();
cout « " characters long" « endl;
70:
cout « "Buffer contains: " « Input.GetString() « endl;
return;
}
74:
int main()
{
MyString SayHello("Hello from StringClass");
// Передача SayHello по значению (с копированием)
UseMyString(SayHello);
81:
return 0;
}
Результат
Constructor: creating new MyString
Buffer points to: 0x0040DA68
Copy constructor: copying from MyString
Buffer points to: 0x0040DAF8
String buffer in MyString is 17 characters long
Buffer contains: Hello from String Class
Invoking destructor, clearing up
Invoking destructor, clearing up
Анализ
Большая часть кода подобна коду листинга 9.8, кроме нескольких строк c o u t, добав ленных в конструктор, и нового конструктора копий, расположенного в строках 27-45. Для начала сосредоточимся на функции m ain (), которая (как и прежде) создает объект S a y H e llo в строке 77. Создание объекта S a y H e llo приводит к отображению первой строки вывода, оператор c o u t которой расположен в строке 12 конструктора M y S trin g . Для удобства конструктор отображает также адрес области памяти, на которую указыва ет B u f f e r . Затем, в строке 80, функция m ain () передает объект S a y H e llo по значению функции U seM y S trin g (), что автоматически приводит к вызову конструктора копий, как свидетельствует вывод. Код в конструкторе копий очень похож на таковой в конструкторе. Основная идея та же — выяснить длину строки в стиле С, которая содержится в буфе ре оригинала (строка 34), зарезервировать достаточно памяти в собственном экземпляре
230 ЗАНЯТИЕ 9. Классы и объекты
ВНИМАНИЕ! Использование ключевого слова const в объявлении конструктора копий га
рантирует, что он не изменит то, на что указывает исходный объект.
Кроме того, параметр должен передаваться в конструктор копий по ссылке.
Если бы он не передавался по ссылке, то конструктор сам вызвал бы копирова- 1
ние значения, приведя таким образом к поверхностному копированию данных !
оригинала, а именно этого мы и намеревались избежать. |
РЕКОМЕНДУЕТСЯ
Всегда создавайте конструктор копий и опера тор присвоения копии, когда ваш класс содер жит простой указатель (raw pointer) (например, char* и т.п.)
Всегда создавайте конструктор копий с кон стантным параметром ссылки на оригинал
Используйте как члены такие классы строк, как std::string, и классы интеллектуальных ука зателей вместо простых указателей, поскольку они реализуют конструкторы копий и экономят ваше время
Do'stlaringiz bilan baham: |