Страница 1 из 2

Деструктор

Добавлено: 16 окт 2010, 19:24
Lotles
Вызывается 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;
}

Re: Деструктор

Добавлено: 16 окт 2010, 21:45
BulldozerBSG
String a, b, c;

Re: Деструктор

Добавлено: 16 окт 2010, 23:15
Lotles
А почему если сделать так:

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

    String d = a + b + c;
то вызывается на один деструктор меньше

Re: Деструктор

Добавлено: 17 окт 2010, 01:44
BulldozerBSG
запусти под отладчиком и пошагово пройдись, станет все понятно.

Re: Деструктор

Добавлено: 17 окт 2010, 02:38
Lotles
Я не умею пользоваться отладчиком

Re: Деструктор

Добавлено: 17 окт 2010, 12:46
Romeo
Плохо считал. Количество деструкторов будет то же самое, а вот набор конструкторов поменяется. В первом случае вызывался конструктор по умолчанию, а потом оператор присваивания. Во втором случае лишь один конструктор копирования.

Re: Деструктор

Добавлено: 17 окт 2010, 15:03
BulldozerBSG
Lotles писал(а):Я не умею пользоваться отладчиком

Никогда не поздно начинать...

Конструктор копирования

Добавлено: 17 окт 2010, 17:36
Lotles
Подскажите, плиз , конструктор копирования вызывается 2 раза, по-моему, должно 3 раза вызываться:
1 раз) Создали временный объект (в operator +), сложили a+b, передали(вызывается конструктор копирования), удалили(из operator +)
2 раз) Создали еще временный объект(в operator +), сложили ((a+b)+c), передали(вызывается конструктор копирования), удалили(из operator +)
3 раз) Конструктор копирования должен вызываться, когда из временного объекта, отсюда (a + b + c) копируется в d

Re: Деструктор

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

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

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

Re: Деструктор

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

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

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

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

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