Форум программистов, компьютерный форум CyberForum.ru

Деструкторы - C++

Восстановить пароль Регистрация
 
DJames-
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 12
24.09.2012, 21:20     Деструкторы #1
Всем доброго времени суток! Возникли некоторые непонятки с деструкторами, а точнее их время вызова и механизм работы.

Вот код:

#include <iostream.h>
#include <conio.h>

class String
{
public:
String();
String(char*);
~String();

friend ostream &operator<<(ostream &,String );
friend istream &operator>>(istream &,String &);
private:
char* ln;
int sizeln;
};

String::String()
{
ln = new char [256];
sizeln = 256;
cout << "Empty Constructor called!" << endl;
}
String::String(char *sPtr)
{
sizeln = strlen(sPtr);
ln = new char [sizeln];
ln = sPtr;
cout << "Constructor with parameters called!" << endl;
}
String::~String()
{
delete [] ln;
cout << "Destructor called!" << endl;
}
ostream &operator<<(ostream &out,String s1)
{
out << s1.ln << endl;

return out;
}
istream &operator>>(istream &in,String &s)
{
in.getline(s.ln,256);
s.sizeln = strlen(s.ln);

return in;
}

main()
{
String s1 = "Operators"; //Constructor with parameters called
String s2 = "on cpp"; //Constructor with parameters called
String s3,s4; //Empty Constructor called

cout << s1 << s2; //two destructors called

cin >> s3 >> s4;

cout << s3 << s4; //two destructors called

getch();

return 0;
}
//all destructors called

Непонятно почему при команде cout вызывается деструктор, хотя строка не обнуляеться.
И вообще хотелось бы услышать общую оценку о программе. Мне кажется что я неправильно использую операторы new и delete и деструкторы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2012, 21:20     Деструкторы
Посмотрите здесь:

for_each и деструкторы C++
Констуркторы, деструкторы.... C++
C++ Деструкторы
C++ Конструкторы и деструкторы
Где деструкторы? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
24.09.2012, 21:34     Деструкторы #2
объект вышел из области видимости = вызван деструктор
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.09.2012, 21:38     Деструкторы #3
C++
1
2
3
4
5
6
ostream &operator<<(ostream &out,String s1)
{
out << s1.ln << endl;
 
return out;
}
При вызове будет создана копия объекта (ибо передача по значению, будет вызван конструктор копирования, который у вас кстати не определен, компилятор использует неявно сгенерированный, который просто копирует данные, следовательно ваш код некорректен, потому как два объекта будут содержать один адрес), соответственно при выходе из функции вызывается деструктор для данного объекта.
DJames-
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 12
25.09.2012, 19:48  [ТС]     Деструкторы #4
Ах да! Спасибо, со всем разобрался.
Yandex
Объявления
25.09.2012, 19:48     Деструкторы
Ответ Создать тему
Опции темы

Текущее время: 03:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru