C++ презаписване на деструктори - продължава ли да зачиства паметта?
Здравейте,
Опитвам се да разбера как работят деструкторите и какво се случва, когато ги презапишем. Разсъждавам по аналогия с Java и C#.
Доколкото разбирам има дефолтен деструктор. Най-вероятно долу изглежда нещо от рода на:
~MyClass()
{
deleteFromMemory();
}
Ако обаче ние имплементираме деструктор, фактически овърлоудваме дефолтния. Примерно правим
~MyClass()
{
cout << "MyClass has been destroyed";
}
Обаче никъде в нашия деструктор ние не му казваме да си зачисти паметта. Не трябва ли вътре в него да извикаме деструктора на базовия метод или нещо такова?
Въпроса всякаш не е свързан конкретно с деструктурите а по-скоро с плейсхолдърите в printf(). Тъй като аз срещнах нещо подобно днес, направих един кратък рисърч, който ме доведе до C++ Reference - printf(). Това което открих е, че плейсхолдъра, който принципно очакваме (от Java поне) да отговаря на стринг - %s всъщност приема пойнтър към character - *char, даже по-конкретно:
Съответно техният пример е
което при
принтира "Hello World". С други думи в твоя случай, просто можеш да използваш или char* name = .... или char name[] = ... и играта спи :) Поздрави!
Плейсхолдъра %s отговаря за const char*, а не за std::string.
В printf няма плейсхолдър за std::string.
1) Едното решение е, както jicata е казал, да използваш char*.
2) Втори вариант е да ползваш std::string и като принтираш (с printf) да ползваш c_str(), което ще преобразува std::string-a ти в char*. (не знам колко е бавно/бързо)
Мерси за отговорите и двата начина, които дадохте работят. Естествено сега ми изникват още въпроси: от сорта на има ли значение как се деклариара променливата ? явно няма значение къде точно е поставен оператора *
Въпрос на конвенция. Дори повечето инструменти за форматиране на кода имат опции за това къде да се намира звездата.
Като цяло е прието да е залепена за идентификатора. На мен лично ми е по-логично да е залепена за типа, защото го считам за част от типа, но явно мнозинството мисли по-различно.