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

Принцип работы конструктора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
gigs
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 396
18.06.2013, 23:00     Принцип работы конструктора #1
Объясните пожалуйста на простом примере принцип работы конструктора в С++. Я сейчас начал их изучать и никак не могу въехать. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2013, 23:00     Принцип работы конструктора
Посмотрите здесь:

объсните принцип работы C++
C++ Принцип работы рекурсии
C++ Принцип реализации и работы со стеком
Принцип работы switch C++
C++ Принцип работы программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
19.06.2013, 11:01     Принцип работы конструктора #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream.h>
 
class MyClass
{
private:
        int someInt;         // Защищенный недоступный из вне член
public:
        MyClass();             // Конструктор по умолчанию
        MyClass(int someInt_); // Конструктор с параметрами
 
        int SomeOutMethod();   // Какой-то метод, работающий с защищенным членом
};
 
MyClass::MyClass()             // Если ничего не передали сами устанавливаем
{                              //  значение члена
someInt = 0;
}
 
MyClass::MyClass(int someInt_) // Если в при создании экземпляра класса
{                              //  в его конструктор передали значение,
someInt = someInt_;            //  то им и инициализируем защищенный член
}
 
int MyClass::SomeOutMethod()   // Вывод защищенного члена
{
return someInt;
}
 
int main()
{
MyClass *myclass1 = new MyClass(); // Ничего не передали
cout << myclass1->SomeOutMethod(); // Выведет ноль
 
                         cout << endl;
 
MyClass *myclass2 = new MyClass(911);  // Передали 911
cout << myclass2->SomeOutMethod();     // 911 и выведет
 
cin.ignore();
return 0;
}
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
19.06.2013, 12:28     Принцип работы конструктора #3
gigs, конструктор выполняет начальную инициализацию объекта. Конечно, он может использоваться и для другого, но изначально ему отведена роль именно инициализатора.
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    int i;
    A(): i(10) {} // инициализируем i значением 10
};
int main()
{
    A a; // здесь i будет равна 10
    std::cout << a.i;
}

Не по теме:

SatanaXIII, а как же память зачистить? В данном случае конечно необязательно, но ТС посмотрит и всегда так делать будет)

SatanaXIII
19.06.2013, 12:57
  #4

Не по теме:

Цитата Сообщение от BumerangSP Посмотреть сообщение
SatanaXIII, а как же память зачистить? В данном случае конечно необязательно, но ТС посмотрит и всегда так делать будет)
Я специально писать не стал. Может его это не интересует? Всплывет - спросит. А так можно было бы начать с двух страниц сообщений вида "Зачем тебе ооп, возьми паскаль"


Не по теме:

Тогда уж поясните ТС почему у вас конструктор со списком инициализации, и что будет если попробовать его инициировать ссылкой.


Не по теме:

А еще мы про конструктор копирования не вспомнили.

BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
19.06.2013, 13:36     Принцип работы конструктора #5
SatanaXIII, а смысл объяснять остальное, ему ведь нужно только понять, для чего конструктор как таковой нужен.
А список я на автомате прикрутил, именно в данном случае он не необходим.

Не по теме:

А вот у Вас inline в реализации методов класса не дописан, почему? inline действует только при объявлении, если реализация отдельно, то функция уже не подставляемая. Эх, придирки

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 13:47     Принцип работы конструктора #6
http://www.cyberforum.ru/blogs/18334/blog103.html
gigs
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 396
19.06.2013, 22:41  [ТС]     Принцип работы конструктора #7
SatanaXIII, а почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием, это подчеркивание что то означает или это просто так написали ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 07:53     Принцип работы конструктора #8
Цитата Сообщение от gigs Посмотреть сообщение
почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием
А как, без этого, отличить поле класса от параметра конструктора?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
20.06.2013, 09:01     Принцип работы конструктора #9
Цитата Сообщение от gigs Посмотреть сообщение
SatanaXIII, а почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием
Да, как правильно говорит alsav22, чтобы удобнее было читать код:
C++
1
2
3
4
MyClass::MyClass(int someInt_)
{
someInt = someInt_;
}
Так сразу понятно, что someInt это член класса, а someInt_ параметр конструктора (вон он он в скобочках), и видно что кому присваивается. Компилятор-то то конечно разберется, если их одинаково обозвать, но читабельность упадет. Можно вообще записать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyClass
{
private:
        int minSpeed, maxSpeed;         // Защищенные члены
public:
        char someCh;                    // Беззащитный член :)
 
        MyClass(int, int, char);        // Конструктор с параметрами
};
 
MyClass::MyClass(int x, int Var31, char KuSokStRoKi)       
{
minSpeed = x;
maxSpeed = Var31;
someCh = KuSokStRoKi;
}
 
// Или тоже самое через список параметров, как показал BumerangSP:
//MyClass::MyClass() :
//         minSpeed(x),
//         maxSpeed(Var31),
//         someCh(KuSokStRoKi)
//{
//}
Но, согласитесь, так не очень понятно что и куда вообще передается.

Секретное запрещенное объяснение почему был использован именно символ нижнего подчеркивания, а не какой-либо другой
Слава борланде!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 09:24     Принцип работы конструктора #10
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Компилятор-то то конечно разберется, если их одинаково обозвать
Уверены?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.06.2013, 09:33     Принцип работы конструктора #11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так сразу понятно, что someInt это член класса, а someInt_ параметр конструктора
Но лучше все-таки наоборот: называть поля класса с нижним подчеркиванием, чтобы в любом методе не путать их с локальными переменными и параметрами.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
20.06.2013, 10:02     Принцип работы конструктора #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
Смотрите мое секретное запрещенное объяснение. )

Принцип работы конструктора

Цитата Сообщение от 0x10 Посмотреть сообщение
Но лучше все-таки наоборот: называть поля класса с нижним подчеркиванием, чтобы в любом методе не путать их с локальными переменными и параметрами.
Это уже называется стиль.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.06.2013, 10:12     Принцип работы конструктора #13
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Смотрите мое секретное запрещенное объяснение. )
Вы бы лучше в другой функции сделали бы вывод i, чтобы гарантировано было видно, что выводится именно поле класса.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
20.06.2013, 10:37     Принцип работы конструктора #14
Да. Вы правы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream.h>
 
class MyClass
{
private:
        int i;
public:
        MyClass(int i);
 
        void Cout_i();
};
 
MyClass::MyClass(int i)
{
  i = i;
  cout << this->i << endl; // Уже при вот такой записи выведет хрень
}
 
void MyClass::Cout_i()
{
  cout << i; // Выведет хрень
}
 
int main(int argc, char* argv[])
{
  MyClass *mc = new MyClass(7);
  mc->Cout_i();
 
  cin.ignore();
  return 0;
}
Добавлено через 1 минуту
Хотя если конкретно указать
C++
1
2
3
4
5
MyClass::MyClass(int i)
{
  this->i = i;
  cout << this->i << endl; // Выведет 7
}
И Cout_i() так же выведет 7.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.06.2013, 08:18     Принцип работы конструктора #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
Со списками инициализации разберётся:
http://ideone.com/njUpcJ
iv-a
 Аватар для iv-a
15 / 15 / 0
Регистрация: 25.06.2013
Сообщений: 63
25.06.2013, 15:19     Принцип работы конструктора #16
Цитата Сообщение от gigs Посмотреть сообщение
Объясните пожалуйста на простом примере принцип работы конструктора в С++
конструктор - это обычная функция (только без возвращаемого значения). он вызывается в момент создания объекта. если нужно проинициализировать члены класса, то это лучше всего делать в конструкторе. по крайней мере объект сразу же после создания будет находится в непротиворечивом состоянии вот

Добавлено через 10 минут
и небольшой пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Time
{
public:
    Time(int hour, int minute, int second);
 
private:
    int mHour;      // 0 .. 23
    int mMinute;    // 0 .. 59
    int mSecond;    // 0 .. 59
};
 
Time::Time(int hour, int minute, int second)
{
    if (hour <= 23) mHour = hour;
    else mHour = 0;
 
    if (minute <= 59) mMinute = minute;
    else mMinute = 0;
 
    if (second <= 59) mSecond = second;
    else mSecond = 0;
}
 
int main()
{
    Time t(10, 10, 10);     // здесь вызывается конструктор для t
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 15:44     Принцип работы конструктора
Еще ссылки по теме:

C++ Принцип работы функции
Принцип работы strpbrk C++
Обьясните принцип работы программы C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
25.06.2013, 15:44     Принцип работы конструктора
  #17

Не по теме:

Цитата Сообщение от iv-a Посмотреть сообщение
конструктор - это обычная функция (только без возвращаемого значения)
Может быть сделаете тогда указатель на конструктор?

Yandex
Объявления
25.06.2013, 15:44     Принцип работы конструктора
Ответ Создать тему
Опции темы

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