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

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

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

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

23.06.2014, 12:58. Просмотров 802. Ответов 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     Конструктор с двоеточием
Посмотрите здесь:

Цикл for с двоеточием - C++
Подскажите, пожалуйста, что это за синтаксис цикла for? Как работает? for (auto& team : table) Чем он отличается от обычного...

Условие с двоеточием. Тернарная условная операция - C++
Все здрасьте. Где то я видел очень полезную вещь, но не могу вспомнить как правильно использовать. Там был пример с двоеточием, вот...

Получить все символы,расположенные между первым и вторым двоеточием - C++
2.Известно что в исходной строке есть двоеточие.получить все символы,расположенные между первым и вторым двоеточием.если второго двоеточия...

Из строи получить фрагменты текста, которые расположены между первым и вторым двоеточием - C++
Помогите, пожалуйста, с написание лабы. задача такая: На экран вывести из каждой строки только те фрагменты текста, которые расположены...

Конструктор - C++
Всем доброго времени суток. Пишу программу, которая вычисляет ранг матрицы и выводит транспонированную. Вот код: matr.h: class matr {...

Конструктор new - C++
#include "stdafx.h" #include <string> #include <iostream> using namespace std; class IoString{ public: string str; ...

Конструктор - C++
скажите пожалуйста зачем в конструкторе мы переменным присваиваем 0? Complex(double r=0,double i=0) { real=r; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
Сообщений: 190
Завершенные тесты: 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
Сообщений: 190
Завершенные тесты: 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Эксперт С++
13056 / 7319 / 816
Регистрация: 27.09.2012
Сообщений: 18,055
Записей в блоге: 3
Завершенные тесты: 1
23.06.2014, 13:40     Конструктор с двоеточием #7
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора.
В теле конструктора будет уже присваивание, а не инициализация
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
23.06.2014, 13:41     Конструктор с двоеточием #8
nokados, нет
Denno
51 / 51 / 6
Регистрация: 21.10.2012
Сообщений: 190
Завершенные тесты: 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
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.06.2014, 14:03     Конструктор с двоеточием #10
Цитата Сообщение от Denno Посмотреть сообщение
ошибка: требуется инициализация члена ссылочного типа.
Где Вы тут ссылочный тип-то нашли? Хотя, справедливости ради, стоит отметить, что инициализации ссылок тоже придется использовать инициализатор конструктора.

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

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

Там ошибка будет такого вида Class2::Class2()" не предоставляет инициализатор для константного члена "Class2::value
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
И снова ни слова про ссылку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 14:37     Конструктор с двоеточием
Еще ссылки по теме:

Конструктор - C++
Для чего здесь конструктор, что он делает? и почему объект one разрушается первым? #include<iostream> using namespace std; class ...

Конструктор - C++
Я вот хотел еще спросить. Вызывается ли второй раз конструктор если вызываешь статический метод ? Например : Код C++ ...

Конструктор - C++
Скажите, как правлиьно оформить конструктор в этом коде? struct Student { public: Student(Student *s) { cout <<...

Конструктор C++ - C++
Привет.Я из этого примера все понял кроме конструктора.Каким образом строка 18 Setcoursename получает от конструктора строку 14 CS101...

Конструктор - C++
Какие числа выведет если убрать cin >> x >> y; #include <stdlib.h> #include <iostream> using namespace std; class myclass { ...


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
13056 / 7319 / 816
Регистрация: 27.09.2012
Сообщений: 18,055
Записей в блоге: 3
Завершенные тесты: 1
23.06.2014, 14:37     Конструктор с двоеточием #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот из Стандарта кусочек:
и всё же
If no initializer is specified for an object, the object is default-initialized
а уже значение его не опредедено
Yandex
Объявления
23.06.2014, 14:37     Конструктор с двоеточием
Ответ Создать тему
Опции темы

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