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

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

Восстановить пароль Регистрация
 
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
23.06.2014, 12:58     Конструктор с двоеточием #1
Новичок.
Объясните, пожалуйста, что за параметры в конструкторе после скобочек за двоеточием?
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++
this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
C++ Конструктор производного класса требует конструктор предка
C++ Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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
50 / 50 / 6
Регистрация: 21.10.2012
Сообщений: 185
Завершенные тесты: 3
23.06.2014, 13:14     Конструктор с двоеточием #4
Инициализация в списке инициализации или в теле конструктора. Хороший вопрос. Хотелось бы услышать мнения других, т.к. я придерживаюсь инициализации в списке инициализации.
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
23.06.2014, 13:16     Конструктор с двоеточием #5
Вообще говоря, да. Но если, например, мемберы _targets и _projectiles константные, то Ваш вариант не соберется.

Добавлено через 1 минуту
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора. Хороший вопрос. Хотелось бы услышать мнения других, т.к. я придерживаюсь инициализации в списке инициализации.
в с++ 11 можно прям при объявлении инициализировать. это удобно, когда у вас несколько конструкторов и в каждом из них мемберы инициализируются одинаковыми значениями.
Denno
50 / 50 / 6
Регистрация: 21.10.2012
Сообщений: 185
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
23.06.2014, 13:40     Конструктор с двоеточием #7
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора.
В теле конструктора будет уже присваивание, а не инициализация
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.06.2014, 13:41     Конструктор с двоеточием #8
nokados, нет
Denno
50 / 50 / 6
Регистрация: 21.10.2012
Сообщений: 185
Завершенные тесты: 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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.06.2014, 14:03     Конструктор с двоеточием #10
Цитата Сообщение от Denno Посмотреть сообщение
ошибка: требуется инициализация члена ссылочного типа.
Где Вы тут ссылочный тип-то нашли? Хотя, справедливости ради, стоит отметить, что инициализации ссылок тоже придется использовать инициализатор конструктора.

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

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

Там ошибка будет такого вида Class2::Class2()" не предоставляет инициализатор для константного члена "Class2::value
Tulosba
:)
Эксперт C++
4378 / 3221 / 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
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 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++ Цикл for с двоеточием
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 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     Конструктор с двоеточием
Ответ Создать тему
Опции темы

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