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

Перегруженный конструктоор- так пойдет? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Использование vector insert и своего типа данных http://www.cyberforum.ru/cpp-beginners/thread948526.html
Не понимаю почему вот здесь выскакивает странная ошибка: arr.insert(arr.begin(),(*max)); #include <iostream> #include <iterator> #include <algorithm> #include <vector> #include <numeric>...
C++ Отключение деструктора Вопрос такой. Возможно ли каким-то образом предотвратить вызов деструктора при уничтожении объекта? У меня есть вот такой класс самодельных строк. Из-за вызова деструктора ловлю вылет при операции +... http://www.cyberforum.ru/cpp-beginners/thread948513.html
C++ Если в строке есть символы подходящие к шаблону заменить их на Один символ!
Добрый вечер. Дисциплина мат. Логика. Дали вот такую задачу Задание №1. Написать программу для реализации следующего алгоритма определения является ли данная строка символов пропозициональной...
Передача вместе с сообщением некоторого хеша C++
При передаче информационных сообщений по каналам связи часто возникают ошибки, и получается что полученное сообщение отличается от отправленного. Для борьбы с этим применяют различные коды...
C++ Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится? http://www.cyberforum.ru/cpp-beginners/thread948497.html
То есть фишка в чём: если мы создадим консольный процесс, а потом ИЗМЕНИМ буфер экрана и сделаем его активным, то чёрта с два мы туда что-нибудь запишем общеизвестными функциям, например system...
C++ Кодировка в консоли (на ЕГЭ) В этом году буду писать экзамен, но дело в том, что в visual studio setlocale(LC_ALL,"Rus"); не приводит ни к чему (знаю, что в самой консоли надо настраивать другой шрифт, который поддерживает... подробнее

Показать сообщение отдельно
reisal78
В поисках работы, СПб
663 / 576 / 136
Регистрация: 28.04.2013
Сообщений: 1,643
05.09.2013, 09:37
Пара абзацев из Лафоре.

Относительно вашего примера и деструкторов, имеет смысл прочитать вот это:
Деструкторы
Как мы уже видели, особый метод класса - конструктор – вызывается при создании объекта. Как вы, возможно, догадались, существует другая функция, автоматически вызываемая при уничтожении объекта и называемая деструктором. Деструктор имеет имя, совпадающее с именем конструктора (а следовательно, и класса) и предваряющегося символом ~:
C++
1
2
3
4
5
6
7
8
9
10
class Foo
{
private:
    int data;
public:
    Foo():data(0)    // конструктор (имя такое же, как у класса)
    {}
    ~Foo()          // деструктор (то же имя, но с символом ~)
    {}
};
Подобно конструкторам, деструкторы не возвращают значения и не имеют аргументов, поскольку невозможно уничтожение объектов несколькими способами. Наиболее распространенное применение деструкторов - освобождение памяти, выделенной конструктором при создании объекта. Более подробно мы рассмотрим эти действия в главе 10 «Указатели», а пока использование деструкторов не будет иметь для нас большого смысла.
И насчет перегруженных конструкторов:

Речь идет об этом классе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Distance               // длина в английской системе
{
  private:
    int feet;
    float inches;
  public:                   
    Distance() : feet(0),inches(0.0)  // конструктор без аргументов
      { }
 
    Distance(int ft,float in) : feet(ft),inches(in)     // конструктор с двумя аргументами
      { }
};
Перегруженные конструкторы
Было бы удобно производить инициализацию переменных класса Distance в момент их создания, то есть использовать объявления типа
C++
1
Distance width (5, 6.25);
где определяется объект width, сразу же инициализированный значениями 5 и 6.25 для футов и дюймов для футов и дюймов соответственно.
Чтобы сделать это, вызовем конструктор следующим образом:
C++
1
2
Distance(int ft, float in) : feet(ft),inches(in)
      { }
Мы инициализируем поля feet и inches теми значениями, которые передаются конструктору в качестве аргументов.

Тем не менее, мы хотим сохранить возможность определять переменные класса Distance без инициализации.
C++
1
Distance dist1, dist3;
Если Вы в классе не прописываете конструктор без параметров, то компилятор использует встроенный конструктор (конструктор по умолчанию).

Если бы конструктор по умолчанию не создавался автоматически, то мы не смогли бы определять переменные классов, в которых отсутствует конструктор. Зачастую нам хотелось бы чтобы начальные значения полям объекта присваивались также и в конструкторе без параметров. Если возложить эту функция на конструктор по умолчанию, то мы не сможем узнать, какими значениями были инициализированы поля. Если же для нас важно, какими значениями будут инициализированы поля объекта класса, то нам следует явно определить конструктор. В программе ENGLCON мы поступаем подобным образом:
C++
1
2
Distance() : feet(0),inches(0.0)
{ }
Члены класса инициализируются константными значениями, в данном случае целым значением 0 для переменной feet и вещественным значением 0.0 для переменной inches. Значит, мы можем использовать объекты, инициализируемые с помощью конструктора без параметров, будучи уверенными в том, что поля объекта имеют нулевые, а не другие значения.
Теперь у нас имеется два явно определенных конструктора с одним и тем же именем Distance(), и поэтому говорят, что конструктор является перегруженным. Какой из этих двух конструкторов исполняется во время создания нового объекта, зависит от того, сколько аргументов используется при вызове.

C++
1
2
Distance length;            // вызывает  конструктор без параметров, который присвоит  feet(0),inches(0.0)
Distance width(11, 6.0);        // вызывает второй конструктор, который  присвоит полям указанные значения
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru