Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 401

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

18.06.2013, 23:00. Показов 2923. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните пожалуйста на простом примере принцип работы конструктора в С++. Я сейчас начал их изучать и никак не могу въехать. Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2013, 23:00
Ответы с готовыми решениями:

Getline принцип работы
Не совсем понимаю как влияет цикл. Да, выводится все сообщение, каждая срока с новой строки. Но, как тут происходит взаимодействие с...

Принцип работы pthread_join
Есть код функции pthread_join из glibc. Подскажите: 1) Номер строки и что происходит, если для потока уже вызвали pthread_join? Тут...

Принцип работы fstream
Допустим у нас есть файл из четырех чисел, например: 453 32 43 54. Я создаю экземпляр класса ifstream и инициализирую массив из четырех...

16
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.06.2013, 11:01
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;
}
1
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
19.06.2013, 12:28
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, а как же память зачистить? :) В данном случае конечно необязательно, но ТС посмотрит и всегда так делать будет)

1
19.06.2013, 12:57

Не по теме:

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


Не по теме:

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


Не по теме:

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

1
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
19.06.2013, 13:36
SatanaXIII, а смысл объяснять остальное, ему ведь нужно только понять, для чего конструктор как таковой нужен.
А список я на автомате прикрутил, именно в данном случае он не необходим.

Не по теме:

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

1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 13:47
https://www.cyberforum.ru/blogs/18334/blog103.html
2
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 401
19.06.2013, 22:41  [ТС]
SatanaXIII, а почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием, это подчеркивание что то означает или это просто так написали ?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 07:53
Цитата Сообщение от gigs Посмотреть сообщение
почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием
А как, без этого, отличить поле класса от параметра конструктора?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 09:01
Цитата Сообщение от 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)
//{
//}
Но, согласитесь, так не очень понятно что и куда вообще передается.

Секретное запрещенное объяснение почему был использован именно символ нижнего подчеркивания, а не какой-либо другой
Слава борланде!
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 09:24
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Компилятор-то то конечно разберется, если их одинаково обозвать
Уверены?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
20.06.2013, 09:33
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так сразу понятно, что someInt это член класса, а someInt_ параметр конструктора
Но лучше все-таки наоборот: называть поля класса с нижним подчеркиванием, чтобы в любом методе не путать их с локальными переменными и параметрами.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 10:02
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
Смотрите мое секретное запрещенное объяснение. )



Цитата Сообщение от 0x10 Посмотреть сообщение
Но лучше все-таки наоборот: называть поля класса с нижним подчеркиванием, чтобы в любом методе не путать их с локальными переменными и параметрами.
Это уже называется стиль.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
20.06.2013, 10:12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Смотрите мое секретное запрещенное объяснение. )
Вы бы лучше в другой функции сделали бы вывод i, чтобы гарантировано было видно, что выводится именно поле класса.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 10:37
Да. Вы правы.
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.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.06.2013, 08:18
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
Со списками инициализации разберётся:
http://ideone.com/njUpcJ
0
 Аватар для iv-a
15 / 15 / 8
Регистрация: 25.06.2013
Сообщений: 63
25.06.2013, 15:19
Цитата Сообщение от 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;
}
0
25.06.2013, 15:44

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2013, 15:44
Помогаю со студенческими работами здесь

Принцип работы рекурсии
Искал в инете и в поиске, но никак не могу понять принцип работы рекурсии программно. Допустим есть функция int f(int n) { if(0 ==...

Принцип работы switch
Всем доброго времени суток. Изучаю самостоятельно С++. Возник вопрос по поводу функции switch. Каким образом она работает на данном...

Принцип работы программ
Изучаю с++. Сейчас знаю до классов и все. И у меня возник вопрос. Получается весь принцип работы программы сводится к...

Принцип работы strpbrk
Изначально я думал, что он возвращает только 1ый символ, но эта функция _string operator*(_string &amp;a){ _string t; ...

Принцип работы функции
Помогите, пожалуйста, разобраться в принципе работы функции //Функция находит самую длинную неубывающую подпоследовательность void...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru