Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
1

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

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

Author24 — интернет-сервис помощи студентам
Почему не пойдет и как бывает?

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2013, 23:15
Ответы с готовыми решениями:

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

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

перегруженный метод
Здравствуйте, возможно ли создать перегруженные методы в C# создав только одну перегрузку, тоесть...

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Спасибо!!
А я раньше не обьявлял деструкторы, я про них не очень понял.
0
БНТУ ФИТР
215 / 155 / 42
Регистрация: 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
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
04.09.2013, 23:58 9
Димка, переходи на книгу Дейтелов....
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 00:03  [ТС] 10
Спасибо!!
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
05.09.2013, 08:18 11
kventin_zhuk, лочить класс, ну блокировать его, тобишь, любое наследование от него будет бесполезно, замыкающий класс, как хотите.
1
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
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
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
05.09.2013, 13:28 13
Цитата Сообщение от Wolkodav Посмотреть сообщение
логику запихивания конструктора в private?
для создания синглтонов
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
05.09.2013, 17:48 14
Raali, это все клёво, но смысл тогда почти такой же конструктор пихать в public тогда?

Добавлено через 3 минуты
Просто на данном этапе человек судя повсему с ООП на С++ только еще на вы и ему бы просто разобраться...
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
05.09.2013, 21:33  [ТС] 15
Ну да, имено!
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
05.09.2013, 21:39 16
Цитата Сообщение от reisal78 Посмотреть сообщение
Если Вы в классе не прописываете конструктор без параметров, то компилятор использует встроенный конструктор (конструктор по умолчанию).
если ты не объявил ни один конструктор. Если хоть один объявил то "по умолчанию" пропадает

Добавлено через 2 минуты
Цитата Сообщение от Raali Посмотреть сообщение
для создания синглтонов
а как объект создавать?
там еще одна тонкость есть нужно переопределить new чтобы он и вызывал приват конструктор
следовательно объект можешь создать только динамически
1
15 / 15 / 2
Регистрация: 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;   } 
        
        };
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
05.09.2013, 21:52 18
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Void Bam(
может все таки void

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

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

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

Добавлено через 1 минуту
Конечно, я может что-то не понял...
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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();
1
05.09.2013, 22:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2013, 22:14
Помогаю со студенческими работами здесь

C++ перегруженный метод
Создайте класс с закрытыми членами и перегруженными методами inc (), которые увеличивают аргумент...

перегруженный оператор <<
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp;...

Перегруженный оператор +
Товарищи программисты не могу понять вот этот кусок кода: dist4 = dist1 + dist2 + dist3; у нас...

перегруженный синус
#include &lt;iostream&gt; #include &lt;cmath&gt; #define PI 3.14159265; using namespace std; int main(){...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru