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

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

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

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

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

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

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

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

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -> i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

15
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
23.06.2014, 13:00 #2
список инициализации
1
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;
}
0
Denno
54 / 57 / 9
Регистрация: 21.10.2012
Сообщений: 212
Завершенные тесты: 3
23.06.2014, 13:14 #4
Инициализация в списке инициализации или в теле конструктора. Хороший вопрос. Хотелось бы услышать мнения других, т.к. я придерживаюсь инициализации в списке инициализации.
0
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
23.06.2014, 13:16 #5
Вообще говоря, да. Но если, например, мемберы _targets и _projectiles константные, то Ваш вариант не соберется.

Добавлено через 1 минуту
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора. Хороший вопрос. Хотелось бы услышать мнения других, т.к. я придерживаюсь инициализации в списке инициализации.
в с++ 11 можно прям при объявлении инициализировать. это удобно, когда у вас несколько конструкторов и в каждом из них мемберы инициализируются одинаковыми значениями.
1
Denno
54 / 57 / 9
Регистрация: 21.10.2012
Сообщений: 212
Завершенные тесты: 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; // ошибка: нет подходящего конструктора по умолчанию.
}
1
Croessmah
Эксперт CЭксперт С++
13509 / 7667 / 866
Регистрация: 27.09.2012
Сообщений: 18,864
Записей в блоге: 3
Завершенные тесты: 1
23.06.2014, 13:40 #7
Цитата Сообщение от Denno Посмотреть сообщение
Инициализация в списке инициализации или в теле конструктора.
В теле конструктора будет уже присваивание, а не инициализация
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
23.06.2014, 13:41 #8
nokados, нет
0
Denno
54 / 57 / 9
Регистрация: 21.10.2012
Сообщений: 212
Завершенные тесты: 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;   // ошибка: нет подходящего конструктора по умолчанию.
}
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.06.2014, 14:03 #10
Цитата Сообщение от Denno Посмотреть сообщение
ошибка: требуется инициализация члена ссылочного типа.
Где Вы тут ссылочный тип-то нашли? Хотя, справедливости ради, стоит отметить, что инициализации ссылок тоже придется использовать инициализатор конструктора.

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

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

Там ошибка будет такого вида Class2::Class2()" не предоставляет инициализатор для константного члена "Class2::value
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 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
И снова ни слова про ссылку
0
Croessmah
Эксперт CЭксперт С++
13509 / 7667 / 866
Регистрация: 27.09.2012
Сообщений: 18,864
Записей в блоге: 3
Завершенные тесты: 1
23.06.2014, 14:37 #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот из Стандарта кусочек:
и всё же
If no initializer is specified for an object, the object is default-initialized
а уже значение его не опредедено
0
23.06.2014, 14:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 14:37
Привет! Вот еще темы с ответами:

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include <algorithm> using...

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

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

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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