С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
#1

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

04.09.2013, 23:15. Просмотров 803. Ответов 24
Метки нет (Все метки)

Почему не пойдет и как бывает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 class Cat
        {
     public:
        Cat(int initialAge=5); 
        ~Cat();
        int GetAge() const; // метод доступа const
        void SetAge (int age);
        void Meow();
      private:
        int itsAge;
        int B;
        Cat( ){itsAge=0; B=8;} 
        ~Cat();
        };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 23:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегруженный конструктоор- так пойдет? (C++):

Перегруженный оператор - C++
MathClass = Harry; Раньше я думал, что перегрузка - это предоставление оператору функций, которых, он изначально не имел. Что...

перегруженный оператор << - C++
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp; operator &lt;&lt; (ostream &amp;c, const...

перегруженный конструктор - C++
можно пример перегруженного конструктора ?)

Перегруженный operator<< - C++
Есть допустим такая дружественная функция: объявление template&lt;typename Type&gt; friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp;,...

перегруженный синус - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #define PI 3.14159265; using namespace std; int main(){ double a,b,x,y,e; e=2.71; ...

Перегруженный operator= - C++
Изучаю перегрузку, возник вопрос. Есть класс: class chk { private: int id; int data; public: chk(); chk(int _data);

24
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
04.09.2013, 23:34 #2
Dimka-novitsek, ок, если просто создать объект класса Cat?
C++
1
Cat a;
Какой конструктор вызывать С++?

Добавлено через 30 секунд
у вас аж целых две штуки подходят, а один еще и private...
1
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
04.09.2013, 23:36 #3
Dimka-novitsek, у вас, кстати говоря, деструкторы переобъявлены =/
1
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
04.09.2013, 23:40 #4
kventin_zhuk, а зачем тут его переопределять? Тут же нету работы с выделением памяти.

Добавлено через 1 минуту
Dimka-novitsek, и вообще можете объяснить логику запихивания конструктора в private? Такое делают, только, что бы лочить класс. Но это по сути изврат ( в С++, так точно).
1
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
04.09.2013, 23:52  [ТС] #5
Вы знаете, я и сам не зню, что пишу.

Добавлено через 1 минуту
А деструкторы переобъявлены- это плохо или хорошо?

Добавлено через 2 минуты
А что, конструктор в private не нужен? И что такое лочить класс?

Добавлено через 3 минуты
Я хотел попробовать написать перегруженный конструктор, и обнаружил ошибку компиляции. Спасибо за ответы! Цель написать что-нибудь.
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
04.09.2013, 23:54 #6
Dimka-novitsek, Если я правильно понял, лочить класс - это чтобы обеспечить существования объекта класса в единственном экземпляре(синглтон). Если не то имелось в виду - попрявят.

про деструкторы - Ну а что хорошего?) Вы хотите два одинаковых деструктора всунуть - компилятор негодует)
1
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
04.09.2013, 23:57  [ТС] #7
Какая тут может быть работа с выделением памяти ?

Добавлено через 1 минуту
Спасибо!!
А я раньше не обьявлял деструкторы, я про них не очень понял.
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
04.09.2013, 23:58 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Hotel
{
private:
    int _count;
public:
    Hotel()
    {
        _count = 10;
    }
    Hotel(int count)
    {
        _count = count;
    }
};
вот вам банальный пример перегрузки конструкторов. Если передаем конструктору целое число - задается значение соответствующему полю. Если вызываем конструктор без параметров - задастся значение 10;
1
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
04.09.2013, 23:58 #9
Димка, переходи на книгу Дейтелов....
1
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 00:03  [ТС] #10
Спасибо!!
0
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
05.09.2013, 08:18 #11
kventin_zhuk, лочить класс, ну блокировать его, тобишь, любое наследование от него будет бесполезно, замыкающий класс, как хотите.
1
reisal78
677 / 589 / 139
Регистрация: 28.04.2013
Сообщений: 1,678
05.09.2013, 09:37 #12
Пара абзацев из Лафоре.

Относительно вашего примера и деструкторов, имеет смысл прочитать вот это:
Деструкторы
Как мы уже видели, особый метод класса - конструктор – вызывается при создании объекта. Как вы, возможно, догадались, существует другая функция, автоматически вызываемая при уничтожении объекта и называемая деструктором. Деструктор имеет имя, совпадающее с именем конструктора (а следовательно, и класса) и предваряющегося символом ~:
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
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,070
Завершенные тесты: 1
05.09.2013, 13:28 #13
Цитата Сообщение от Wolkodav Посмотреть сообщение
логику запихивания конструктора в private?
для создания синглтонов
1
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
05.09.2013, 17:48 #14
Raali, это все клёво, но смысл тогда почти такой же конструктор пихать в public тогда?

Добавлено через 3 минуты
Просто на данном этапе человек судя повсему с ООП на С++ только еще на вы и ему бы просто разобраться...
1
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 21:33  [ТС] #15
Ну да, имено!
0
05.09.2013, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 21:33
Привет! Вот еще темы с ответами:

Функции и перегруженный оператор - C++
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь), представляющий собой структуру из 2х полей:...

Перегруженный оператор присваивания - C++
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю суть данного вопроса - &quot;в каком месте...

Перегруженный оператор ввода - C++
Всем привет, как правильно создать перегруженный оператор ввода для инициализации данных об обьекте к примеру class Planet{ ...

Функтор и перегруженный оператор - C++
захотел понять многопоточность в новом стадарте с++11 - смотрю http://sergeyteplyakov.blogspot.ru/2012/05/c-11-faq.html#std-threads - вижу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.