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

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

Восстановить пароль Регистрация
 
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
04.09.2013, 23:15     Перегруженный конструктоор- так пойдет? #1
Почему не пойдет и как бывает?

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();
        };
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 23:15     Перегруженный конструктоор- так пойдет?
Посмотрите здесь:

C++ перегруженный синус
Перегруженный оператор ввода C++
C++ перегруженный оператор <<
C++ Перегруженный оператор
C++ перегруженный конструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
04.09.2013, 23:34     Перегруженный конструктоор- так пойдет? #2
Dimka-novitsek, ок, если просто создать объект класса Cat?
C++
1
Cat a;
Какой конструктор вызывать С++?

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

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

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

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

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

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

Добавлено через 1 минуту
Спасибо!!
А я раньше не обьявлял деструкторы, я про них не очень понял.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 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;
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
04.09.2013, 23:58     Перегруженный конструктоор- так пойдет? #9
Димка, переходи на книгу Дейтелов....
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 00:03  [ТС]     Перегруженный конструктоор- так пойдет? #10
Спасибо!!
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
05.09.2013, 08:18     Перегруженный конструктоор- так пойдет? #11
kventin_zhuk, лочить класс, ну блокировать его, тобишь, любое наследование от него будет бесполезно, замыкающий класс, как хотите.
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
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);        // вызывает второй конструктор, который  присвоит полям указанные значения
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
05.09.2013, 13:28     Перегруженный конструктоор- так пойдет? #13
Цитата Сообщение от Wolkodav Посмотреть сообщение
логику запихивания конструктора в private?
для создания синглтонов
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
05.09.2013, 17:48     Перегруженный конструктоор- так пойдет? #14
Raali, это все клёво, но смысл тогда почти такой же конструктор пихать в public тогда?

Добавлено через 3 минуты
Просто на данном этапе человек судя повсему с ООП на С++ только еще на вы и ему бы просто разобраться...
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 21:33  [ТС]     Перегруженный конструктоор- так пойдет? #15
Ну да, имено!
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.09.2013, 21:39     Перегруженный конструктоор- так пойдет? #16
Цитата Сообщение от reisal78 Посмотреть сообщение
Если Вы в классе не прописываете конструктор без параметров, то компилятор использует встроенный конструктор (конструктор по умолчанию).
если ты не объявил ни один конструктор. Если хоть один объявил то "по умолчанию" пропадает

Добавлено через 2 минуты
Цитата Сообщение от Raali Посмотреть сообщение
для создания синглтонов
а как объект создавать?
там еще одна тонкость есть нужно переопределить new чтобы он и вызывал приват конструктор
следовательно объект можешь создать только динамически
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 21:45  [ТС]     Перегруженный конструктоор- так пойдет? #17
А вот я решил в private создать функцию, для опыта. Конструктор там, видимо, почти плностью бисполезен, т.к. все что там находится видно только внутри класса, и его можно проще написать в public.
Компилятор ругается- перед функцией ему точки с запятой не хватает.. И т.п.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
   class Cat
        {
     public:
        Cat(int initialAge=5); 
        ~Cat();
        int GetAge() const; // метод доступа const функция доступа к данным-членам класса без права их изменения
        void SetAge (int age);
        void Meow();
        void Wydam()  {Bam();};   //статический метод
      private:
        int itsAge; // статические переменные класса (Статическое поле)
        int B;
        Void Bam(itsAge=0; B=8; ){cout << "Wydam\n";
                                  int BG=itsAge+ B;
                                  cout << BG;   } 
        
        };
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.09.2013, 21:52     Перегруженный конструктоор- так пойдет? #18
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Void Bam(
может все таки void

Добавлено через 1 минуту
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
private:
int itsAge; // статические переменные класса (Статическое поле)
это не статическое а частное (private) т.е обращаться может только сам класс
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 22:04  [ТС]     Перегруженный конструктоор- так пойдет? #19
Спасибо!!!!

Добавлено через 9 минут
ВикипедиЯ
Класс (программирование)

Как и структуры, классы могут задавать поля — то есть переменные, принадлежащие либо непосредственно самому классу (статические), либо экземплярам класса (обычные). Статические поля существуют в одном экземпляре на всю программу (или, в более сложном варианте, — в одном экземпляре на процесс или на поток/нить). Обычные поля создаются по одной копии для каждого конкретного объекта — экземпляра класса.

Добавлено через 1 минуту
Конечно, я может что-то не понял...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 22:14     Перегруженный конструктоор- так пойдет?
Еще ссылки по теме:

C++ Перегруженный operator<<
Перегруженный постфиксный оператор ++ C++
Перегруженный operator= C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
05.09.2013, 22:14     Перегруженный конструктоор- так пойдет? #20
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Конечно, я может что-то не понял...
ага
у статического ключевое слово static
вот если бы ты написал
C++
1
static int itsAge;
то itsAge было бы статическим
хоть сто объектов создай itsAge будет один

чтобы понять разницу
попробуй вот эти два кода
C++
1
2
3
4
5
6
7
8
void fnc(void)
{
int s=0;
printf("%d ",++s);
}
........................
for(int i=0;i<10;i++)
  fnc();
и
C++
1
2
3
4
5
6
7
8
void fnc(void)
{
static int s=0;
printf("%d ",++s);
}
........................
for(int i=0;i<10;i++)
  fnc();
Yandex
Объявления
05.09.2013, 22:14     Перегруженный конструктоор- так пойдет?
Ответ Создать тему
Опции темы

Текущее время: 08:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru