Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
Всем привет. В одной из моих тем, не касающихся вопроса этого топика, я подымал вопрос о двоеточии в конструкторе. Вот мой вопрос и ответ на него. К сожалению, ответ не прояснил для меня данную конструкцию. Буду благодарен, за более детальное объяснение. Заранее спасибо! список инициализацииMaximuS_GИ еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример: Рассмотрим простой класс: Код: plaintext 1. 2. 3. 4. 5. 6. При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор: Код: plaintext 1. 2. 3. 4. Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста. То что идет после имени конструктора после двоеточия - это список инициализации. В нем можно вызывать конструкторы членов класса. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Аналог без класса: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 12:54 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Пусть у нас есть вот такая пара классов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Как можно видеть, конструктор Derived выглядит очень просто. Но что он делает? 1) Вызывает конструктор базового класса Base; 1.1) Тот вызывает конструктор std::string для создания члена m_str. 2) Вызывает конструктор std::pair<int,int> для создания члена m_values. 3) И только потом вызывает operator<<(std::cout&, const char*) и далее по списку. Все вызываемые конструкторы, в данном случае - конструкторы без параметров. Если такое поведение нас устраивает, то и хорошо. А если нет, то эти "предварительные" действия можно переопределить: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 13:17 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
Abstraction, Спасибо большое за обширный пример. К сожалению, я еще не учил наследование, поэтому дополнительный незнакомый синтаксис усложняет понимание. Насколько я понял, если класс А содержит поле, которое имеет тип класса B, то при описание конструктора для класса А, мы можем указать, какие параметры будут передаваться в конструктор класса B. Правильно? Я вот пытаюсь простой пример сделать, но куча ошибок при компиляции вылетает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 13:56 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
MaximuS_GAbstraction, Спасибо большое за обширный пример. К сожалению, я еще не учил наследование, поэтому дополнительный незнакомый синтаксис усложняет понимание. Насколько я понял, если класс А содержит поле, которое имеет тип класса B, то при описание конструктора для класса А, мы можем указать, какие параметры будут передаваться в конструктор класса B. Правильно?Нет "конструктора класса" в этом смысле, есть "конструктор экземпляра". Кроме того, с точки зрения пользователя класса есть только сигнатура конструктора - можно использовать лишь те аргументы, которые нам передали: Код: plaintext 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. Есть один нюанс: как и всегда в С++, перечисление действий через запятую означает, что выполниться они могут в другом порядке. В случае списков инициализации, конструкторы будут вызываться в том порядке, в котором соответствующие члены были объявлены в классе (т.е. сначала m_member1, потом m_member2 - для нашего примера), в каком бы порядке мы ни указывали их в списке инициализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 14:25 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
Abstraction как и всегда в С++, перечисление действий через запятую означает, что выполниться они могут в другом порядке Не всегда. В операторе следования запятые задают строгую последовательность вычисления. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 14:35 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
Abstraction, Ага, спасибо большое, теперь намного понятнее. Получается все переменные, которые я получая в конструктор, я могу распределить между членами класса, правильно? А может одна переменная использоваться для инициализации нескольких объектов разных классов? Переделал свой пример, теперь все работает: class B { public: int a; B(int a=0) { this->a = a; } }; class A { B ocObj; //класс А содержит поле, которое имеет тип класса B A(): //при описание конструктора для класса А ocObj(a) //мы можем указать, какому экземпляру класса B передать в конструктор значение "a" {}; }; int main() { A obj; } Спасибо большое за помощь! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 15:04 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
В операторе следования запятые задают строгую последовательность вычисления.*стучит себе по голове* Да. Правильно. Вы же мне об этом и говорили. "Как и в некоторых других местах C++,..." авторА может одна переменная использоваться для инициализации нескольких объектов разных классов?Да, посмотрите ещё раз последний пример. Вообще, у Вас есть аргументы конструктора плюс любые иные переменные в области видимости (глобальные переменные, константы) плюс литералы/нумералы, и что угодно из этого Вы вправе передавать в качестве аргументов любых конструкторов в списке инициализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 15:11 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
AbstractionДа, посмотрите ещё раз последний пример. Вообще, у Вас есть аргументы конструктора плюс любые иные переменные в области видимости (глобальные переменные, константы) плюс литералы/нумералы, и что угодно из этого Вы вправе передавать в качестве аргументов любых конструкторов в списке инициализации. Вас понял, все четко ясно. Спасибо большое! Удачи! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 15:39 |
|
||
|
Двоеточие в констукторе
|
|||
|---|---|---|---|
|
#18+
/*Хочется тоже поучаствовать. Объяснено , конечно, замечательно, но, возможно, этот совсем простой код тоже кому-нибудь будет полезен, ведь последний пост Максимуса, говорит о том, что он не до конца разобрался. По моему вот то, что хотел Максимус, но так и не услышал*/ class B { int b; public: B(int x=0){b = x;} //А можно и так, но так никто не делает{this->b=x;} int get_b(){return b;} }; class A { B bb; public: //здесь Максимус забыл, что конструктор всегда делается public: A(int y):bb(y){}; int get_bb(){return bb.get_b();} }; int main(){ A obj(5); cout<<obj.get_bb(); } //А в остальном у Максимуса все правильно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 08:50 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=68&tid=2019839]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 286ms |
| total: | 439ms |

| 0 / 0 |
