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

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

Войти
Регистрация
Восстановить пароль
 
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
#1

Конструктор с двоеточием - C++

23.06.2014, 12:58. Просмотров 663. Ответов 15
Метки нет (Все метки)

Новичок.
Объясните, пожалуйста, что за параметры в конструкторе после скобочек за двоеточием?
C++
1
2
3
4
5
HelloWorld::HelloWorld()
:_targets(NULL),
_projectiles(NULL)
{
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 12:58     Конструктор с двоеточием
Посмотрите здесь:

Конструктор C++
Из строи получить фрагменты текста, которые расположены между первым и вторым двоеточием C++
Получить все символы,расположенные между первым и вторым двоеточием C++
C++ конструктор
this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
C++ Конструктор
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
23.06.2014, 13:00     Конструктор с двоеточием #2
список инициализации
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
23.06.2014, 13:04  [ТС]     Конструктор с двоеточием #3
Верно ли я понимаю, что это равносильно
C++
1
2
3
4
5
HelloWorld::HelloWorld()
{
_targets = NULL;
_projectiles = NULL;
}
Denno
51 / 51 / 6
Регистрация: 21.10.2012
Сообщений: 187
Завершенные тесты: 3
23.06.2014, 13:14     Конструктор с двоеточием #4
Инициализация в списке инициализации или в теле конструктора. Хороший вопрос. Хотелось бы услышать мнения других, т.к. я придерживаюсь инициализации в списке инициализации.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
23.06.2014, 13:16     Конструктор с двоеточием #5
Вообще говоря, да. Но если, например, мемберы _targets и _projectiles константные, то Ваш вариант не соберется.

Добавлено через 1 минуту
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора. Хороший вопрос. Хотелось бы услышать мнения других, т.к. я придерживаюсь инициализации в списке инициализации.
в с++ 11 можно прям при объявлении инициализировать. это удобно, когда у вас несколько конструкторов и в каждом из них мемберы инициализируются одинаковыми значениями.
Denno
51 / 51 / 6
Регистрация: 21.10.2012
Сообщений: 187
Завершенные тесты: 3
23.06.2014, 13:34     Конструктор с двоеточием #6
Цитата Сообщение от Kukurudza Посмотреть сообщение
Вообще говоря, да. Но если, например, мемберы _targets и _projectiles константные, то Ваш вариант не соберется.
Или когда класс не имеет конструктора без параметров.

Добавлено через 16 минут
Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Class1
{
    public:
        Class1(int count) { count = 0; };
};
 
class Class2
{
    public:
        Class2();
 
    private:
        Class1 class1;
};
 
Class2::Class2()
{
    class1 = this; // ошибка: нет подходящего конструктора по умолчанию.
}
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,510
Записей в блоге: 2
Завершенные тесты: 1
23.06.2014, 13:40     Конструктор с двоеточием #7
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора.
В теле конструктора будет уже присваивание, а не инициализация
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
23.06.2014, 13:41     Конструктор с двоеточием #8
nokados, нет
Denno
51 / 51 / 6
Регистрация: 21.10.2012
Сообщений: 187
Завершенные тесты: 3
23.06.2014, 13:43     Конструктор с двоеточием #9
Цитата Сообщение от Denno Посмотреть сообщение
Или когда класс не имеет конструктора без параметров.
Вот так лучше:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Class1
{
    public:
        Class1(int count) { count = 0; };
};
 
class Class2
{
    public:
        Class2();
 
    private:
        Class1 class1;
        const int value;
};
 
Class2::Class2() : class1(0), value(0)
{
    //value = 0;    // ошибка: требуется инициализация члена ссылочного типа.
    //class1 = 0;   // ошибка: нет подходящего конструктора по умолчанию.
}
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.06.2014, 14:03     Конструктор с двоеточием #10
Цитата Сообщение от Denno Посмотреть сообщение
ошибка: требуется инициализация члена ссылочного типа.
Где Вы тут ссылочный тип-то нашли? Хотя, справедливости ради, стоит отметить, что инициализации ссылок тоже придется использовать инициализатор конструктора.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
В теле конструктора будет уже присваивание, а не инициализация
Не совсем. Например, если поле типа int, то присваивание значения будет и инициализацией, т.к. до этого поле было не инициализировано. В общем, тут вопрос терминологии и, вероятно, возможны разночтения.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,510
Записей в блоге: 2
Завершенные тесты: 1
23.06.2014, 14:10     Конструктор с двоеточием #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Где Вы тут ссылочный тип-то нашли? Хотя, справедливости ради, стоит отметить, что инициализации ссылок тоже придется использовать инициализатор конструктора.
Но тут стоит отметить, что если связать константную ссылку с временным объектом в списке инициализации, то время жизни временного объекта закончится после выхода из конструктора.

Добавлено через 41 секунду
Цитата Сообщение от Tulosba Посмотреть сообщение
Например, если поле типа int, то присваивание значения будет и инициализацией, т.к. до этого поле было не инициализировано.
Оно имеет значение, а значит, по сути, оно было инициализировано мусором, но
Цитата Сообщение от Tulosba Посмотреть сообщение
тут вопрос терминологии и, вероятно, возможны разночтения.
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.06.2014, 14:22     Конструктор с двоеточием #12
Цитата Сообщение от Croessmah Посмотреть сообщение
если связать константную ссылку с временным объектом в списке инициализации, то время жизни временного объекта закончится после выхода из конструктора.
Безусловно. Но это уже совсем другая история.
Denno
51 / 51 / 6
Регистрация: 21.10.2012
Сообщений: 187
Завершенные тесты: 3
23.06.2014, 14:33     Конструктор с двоеточием #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Где Вы тут ссылочный тип-то нашли?
Это не я, а mvc++

Там ошибка будет такого вида Class2::Class2()" не предоставляет инициализатор для константного члена "Class2::value
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.06.2014, 14:35     Конструктор с двоеточием #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Оно имеет значение, а значит, по сути, оно было инициализировано мусором
Всё таки инициализация предполагает хотя бы какой-то процесс, а если его не было, то и инициализации как бы нет. Вот из Стандарта кусочек:
8.5/11
If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value.
Добавлено через 33 секунды
Цитата Сообщение от Denno Посмотреть сообщение
не предоставляет инициализатор для константного члена "Class2::value
И снова ни слова про ссылку
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12535 / 7097 / 797
Регистрация: 27.09.2012
Сообщений: 17,510
Записей в блоге: 2
Завершенные тесты: 1
23.06.2014, 14:37     Конструктор с двоеточием #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот из Стандарта кусочек:
и всё же
If no initializer is specified for an object, the object is default-initialized
а уже значение его не опредедено
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 14:47     Конструктор с двоеточием
Еще ссылки по теме:

C++ Конструктор производного класса требует конструктор предка
C++ Условие с двоеточием. Тернарная условная операция
C++ Цикл for с двоеточием
Конструктор C++
C++ Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.06.2014, 14:47     Конструктор с двоеточием #16
8.5/6
To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the
initialization is ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.
Шах и мат
Yandex
Объявления
23.06.2014, 14:47     Конструктор с двоеточием
Ответ Создать тему
Опции темы

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