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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
gigs
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 397
#1

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

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

Объясните пожалуйста на простом примере принцип работы конструктора в С++. Я сейчас начал их изучать и никак не могу въехать. Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2013, 23:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Принцип работы конструктора (C++):

объсните принцип работы - C++
Объясните кому не сложно принцип работы данной программы Планируется переписывание на паскале #include <fstream> using namespace ...

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

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

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

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

Принцип работы программы - C++
Смысл программы: подсчет количества слов и предложений из подключенного файла. Код есть, только не понимаю, почему подсчет слов (s) идет...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 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;
}
1
BumerangSP
4286 / 1408 / 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, а как же память зачистить? В данном случае конечно необязательно, но ТС посмотрит и всегда так делать будет)

1
SatanaXIII
19.06.2013, 12:57
  #4

Не по теме:

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


Не по теме:

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


Не по теме:

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

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

Не по теме:

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

1
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.06.2013, 13:47 #6
http://www.cyberforum.ru/blogs/18334/blog103.html
2
gigs
8 / 9 / 1
Регистрация: 21.12.2011
Сообщений: 397
19.06.2013, 22:41  [ТС] #7
SatanaXIII, а почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием, это подчеркивание что то означает или это просто так написали ?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 07:53 #8
Цитата Сообщение от gigs Посмотреть сообщение
почему вы во втором конструкторе прописали параметр someInt_ с нижним подчеркиванием
А как, без этого, отличить поле класса от параметра конструктора?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 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)
//{
//}
Но, согласитесь, так не очень понятно что и куда вообще передается.

Секретное запрещенное объяснение почему был использован именно символ нижнего подчеркивания, а не какой-либо другой
Слава борланде!
1
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 09:24 #10
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Компилятор-то то конечно разберется, если их одинаково обозвать
Уверены?
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
20.06.2013, 09:33 #11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так сразу понятно, что someInt это член класса, а someInt_ параметр конструктора
Но лучше все-таки наоборот: называть поля класса с нижним подчеркиванием, чтобы в любом методе не путать их с локальными переменными и параметрами.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
20.06.2013, 10:02 #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
Смотрите мое секретное запрещенное объяснение. )

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

Цитата Сообщение от 0x10 Посмотреть сообщение
Но лучше все-таки наоборот: называть поля класса с нижним подчеркиванием, чтобы в любом методе не путать их с локальными переменными и параметрами.
Это уже называется стиль.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
20.06.2013, 10:12 #13
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Смотрите мое секретное запрещенное объяснение. )
Вы бы лучше в другой функции сделали бы вывод i, чтобы гарантировано было видно, что выводится именно поле класса.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 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.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.06.2013, 08:18 #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены?
Со списками инициализации разберётся:
http://ideone.com/njUpcJ
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 08:18
Привет! Вот еще темы с ответами:

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

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

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

Объясните принцип работы программы - C++
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.06.2013, 08:18
Ответ Создать тему
Опции темы

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