Деструктор

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Вызывается 11 раз деструктор класса, я насчитал только 8, хотел узнать где еще 3 вызывается

Код: Выделить всё

#include "stdafx.h"
#include "conio.h"
#include <string.h>
using namespace std;
int a;
class String {
private:
    char* ptr;
public:
	String(){
		cout << "Vizivaetsja konstructor ()" << endl;
		ptr = new char[1];
        ptr[0] = '\0';
	}
	String(char* s){
		    cout << "Vizivaetsja konstruction char*" << endl;
		    int n = strlen(s);
            ptr = new char[n + 1];
            strcpy(ptr, s);
	}
	String(const String& src){ 
		cout << "Vizivaetsja konstruction kopirovanija" << endl;
		    int n = strlen(src.ptr);
            ptr = new char[n + 1];
            strcpy(ptr, src.ptr);
	}

	~String(){
		    delete [] ptr;
			cout << "Vizivaetsja destruction " << endl;
	}

    String& operator=(const String& src){
		cout << "Vizivaetsja operator prisvaivanija" << endl;
		cpy(src.ptr); 
		return *this;
	}

	String operator+(char* s){
		cout << "Vizivaetsja operator+" << endl;
		String new_str(ptr);
            new_str.cat(s);
            return new_str;
	}
    operator char*() {
		cout << "vizvalsja operator preobrazovanija char*" << endl;
		return ptr;
	}
	void cat(char* s){
		    int n = strlen(ptr) + strlen(s);
            char* p1 = new char[n + 1];
            strcpy(p1, ptr);
            strcat(p1, s);
            delete [] ptr;
            ptr = p1;
	}
	void cpy(char* s){
		delete [] ptr;
        int n = strlen(s);
        ptr = new char[n + 1];
        strcpy(ptr, s);
	}
};

int main() {
    String a, b, c;
    a = "I ";                               //1
    b = "am ";                           //2
    c = "so ";                            //3
	String d;                       
    d = a + b + c;                  //4-7 
    cout << d << endl;         //8
    return 0;
}
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

String a, b, c;
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

А почему если сделать так:

Код: Выделить всё

    String d = a + b + c;
то вызывается на один деструктор меньше
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

запусти под отладчиком и пошагово пройдись, станет все понятно.
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Я не умею пользоваться отладчиком
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Плохо считал. Количество деструкторов будет то же самое, а вот набор конструкторов поменяется. В первом случае вызывался конструктор по умолчанию, а потом оператор присваивания. Во втором случае лишь один конструктор копирования.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Lotles писал(а):Я не умею пользоваться отладчиком

Никогда не поздно начинать...
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Подскажите, плиз , конструктор копирования вызывается 2 раза, по-моему, должно 3 раза вызываться:
1 раз) Создали временный объект (в operator +), сложили a+b, передали(вызывается конструктор копирования), удалили(из operator +)
2 раз) Создали еще временный объект(в operator +), сложили ((a+b)+c), передали(вызывается конструктор копирования), удалили(из operator +)
3 раз) Конструктор копирования должен вызываться, когда из временного объекта, отсюда (a + b + c) копируется в d
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Lotles, я слил твою новую тему "Конструктор" с текущей. Хватит плодить кучу тем, в которых обсуждается один и тот же откописасченый код. Ещё замечание - используй С++ таги для кода, иначе синтаксис не подсвечивается.

Теперь по вопросу. Суть в том, что у d вызывается оператор присвоения, а не конструктор копирования.

Ну и ещё добавлю, хотя и не буду оригинален. Все эти вопросы можно разобрать самостоятельно, если запустить отладчик. Научится пользоваться им значительно проще, чем изучить, как правильно зарегистрироваться на форуме, создать тему и втулить в неё кучу текста, набранного вручную :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Romeo писал(а):Lotles, я слил твою новую тему "Конструктор" с текущей. Хватит плодить кучу тем, в которых обсуждается один и тот же откописасченый код. Ещё замечание - используй С++ таги для кода, иначе синтаксис не подсвечивается.

Теперь по вопросу. Суть в том, что у d вызывается оператор присвоения, а не конструктор копирования.

Ну и ещё добавлю, хотя и не буду оригинален. Все эти вопросы можно разобрать самостоятельно, если запустить отладчик. Научится пользоваться им значительно проще, чем изучить, как правильно зарегистрироваться на форуме, создать тему и втулить в неё кучу текста, набранного вручную :)
Конечно, оператор присваивания
Оператор присваивания копирует значения в уже существующий объект, а конструктор копирования инициализирует новый объект
а там был код
...

Код: Выделить всё

    String d = a + b + c;
так что здесь вызывается конструктор копирования, а не оператор присваивания
И что из того что код один и тот же, вопрос да другой,наоборот, вам легче отвечать, не надо все заново код изучать !
А отладчиком научиться пользоваться надо, не спорю !
Ответить