Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2010, 20:36   #1
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию Деструктор класса

Вызывается 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;
}
Lotles вне форума Ответить с цитированием
Старый 16.10.2010, 20:53   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Скорее так:
Код:
int main() {
    String a, b, c;
    a = "I ";                               //Уничтожаем String("I ") - 1
    b = "am ";                           //String(am) - 2
    c = "so ";                            //String(so ) - 3
    String d;                      
    d = a + b + c;                  //(b + c), (a + (b + c)) - по временному объекту внутри operator+, а также сами временные переменные - 4-7
    cout << d << endl;         
    return 0;    //Автоматическое уничтожение a, b, c, d - 8-11
}
Ну да, все как у вас, только вызываются деструкторы для статических переменных. Вы отловили все тонкие случаи, но забыли про самые тривиальные
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.10.2010, 23:10   #3
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Скорее так:
Код:
int main() {
    String a, b, c;
    a = "I ";                               //Уничтожаем String("I ") - 1
    b = "am ";                           //String(am) - 2
    c = "so ";                            //String(so ) - 3
    String d;                      
    d = a + b + c;                  //(b + c), (a + (b + c)) - по временному объекту внутри operator+, а также сами временные переменные - 4-7
    cout << d << endl;         
    return 0;    //Автоматическое уничтожение a, b, c, d - 8-11
}
Ну да, все как у вас, только вызываются деструкторы для статических переменных. Вы отловили все тонкие случаи, но забыли про самые тривиальные
Вроде так должно быть:
Код:
(a+b), ((a+b)+c)
и еще
Почему если будет так:
Код:
    String d = a + b + c;
то на один деструктор меньше
Lotles вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Абстрактный виртуальный деструктор в базовом классе. Oleg_SK Общие вопросы C/C++ 16 15.06.2010 20:38
Деструктор отменяет изменения [MI_nor] Общие вопросы C/C++ 3 08.11.2009 21:40
С++ Конструктор и Деструктор помогите Maxim_Burea Помощь студентам 15 19.09.2009 19:45
С++ (конструктор, деструктор) Kventin Помощь студентам 4 31.03.2009 18:11
Нужно написать деструктор s-t-r-i-k-e-r Помощь студентам 2 03.06.2008 23:58