20 / 19 / 22
Регистрация: 22.06.2016
Сообщений: 158
1

В чём разница в конструкрукторе со списком инициализации и без оного

20.11.2016, 10:39. Показов 1050. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
объясните пожалуйста разницу между конструктором по умолчанию и конструктором по умолчанию.
первая запись:
C++
1
Circle(float _x = 0.0, float _y = 0.0, float _r = 10.0) :x(_x), y(_y), r(_r), alpha(1.0) {};
вторая запись:
C++
1
2
3
4
5
6
Circle(float _x = 0.0, float _y = 0.0, float _r = 10.0){
x = _x;
y = _y;
r = _r;
alpha = 1.0;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2016, 10:39
Ответы с готовыми решениями:

Разница в определении конструкторов со списком инициализации и без него
Начинаю изучать конструкторы , и в моей книге его объявление выглядит следующим образом class...

В чем разница между простым линейным списком, и динамическим линейным списком?
вопрос в теме

Различные варианты инициализации указателя - в чём точная разница между ними?
Немного непонятен один момент. Есть некий класс Statement (конструктор используется по умолчанию)....

В чём разница между односвязным списком и односвязным стэком?
*весь вопрос находится в названии*

7
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
20.11.2016, 10:42 2
1. Первая запись в некоторых случаях эффективнее, т.к. создание объекта и
заполнение его полей нужными значениями выполняются в один этап, а не в два.

2. В первом случае присваивание значений полям объекта выполняется в
том порядке, в котором они были объявлены в классе.

3. Первая запись - единственный способ инициализации константных и
ссылочных полей класса.
3
20 / 19 / 22
Регистрация: 22.06.2016
Сообщений: 158
20.11.2016, 11:45  [ТС] 3
спасибо!
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
20.11.2016, 12:05 4
Ещё может быть случай, когда нет доступного конструктора по умолчанию:
C++
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
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
class A
{
    int a;
    A(){}
public:
    A(const int rhs)
        :a(rhs)
    {}
    A(const A & rhs)
        :a(rhs.a)
    {}
};
 
class AA
{
    A a;
    
public:
AA()
:a(0)//закоментируйте эту строку и получите ошибку вида:  A::A: невозможно обратиться к private член, объявленному в классе "A"
{}  
};
 
int main(int argc, char* argv[])
{
 
cout<<endl;
system("pause");
return 0;
}
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
20.11.2016, 12:56 5
Цитата Сообщение от Убежденный Посмотреть сообщение
1. Первая запись в некоторых случаях эффективнее, т.к. создание объекта и
заполнение его полей нужными значениями выполняются в один этап, а не в два.
А можешь сказать, в каких случаях? Или речь идёт о гипотетическом варианте, когда отсутствуют оптимизации?

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ещё может быть случай, когда нет доступного конструктора по умолчанию:
Я так понимаю, что в дополнение к посту #2 тут появляется ещё один пункт:

4. Это единственный способ вызвать конструктор НЕ по умолчанию для полей с типом класс/структура

Так?

Добавлено через 4 минуты
Кстати, вот ещё ссылка по теме:
Инициализация в теле конструктора или в списке инициализации, есть ли разница в сгенерированном коде?

Добавлено через 15 секунд
Кстати, вот ещё ссылка по теме:
Инициализация в теле конструктора или в списке инициализации, есть ли разница в сгенерированном коде?
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
20.11.2016, 13:29 6
Цитата Сообщение от Evg Посмотреть сообщение
4. Это единственный способ вызвать конструктор НЕ по умолчанию для полей с типом класс/структура
Так?
В общем это единственный способ инициализации. Я специально показал закрытый конструктор по умолчанию. В сырую и ненастную ночь, вполне может присниться конструктор копирования, который вызывает закрытый конструктор по умолчанию. Не для своего экземпляра, разумеется. Копируем дерево, например. (жуть конечно )
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.11.2016, 14:09 7
Цитата Сообщение от Evg Посмотреть сообщение
А можешь сказать, в каких случаях?
объекты инициализируются в списках инициализации.
если он не задан - инициализируются дефолтным конструктором.

то, что в теле конструктора - это уже присвоение.

то есть получается: сначала инициализируем дефолтом,
а затем присваиваем другое состояние.

для пользовательских классов,
в общем случае такой подход всегда менее эффективен,
по сравнению со списками инициализации,
где можно сразу же посетить нужное состояние.

ну а далее нужно смотреть насколько "тяжелый" дефолтный конструктор
конкретного класса
3
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
20.11.2016, 14:28 8
Цитата Сообщение от Убежденный Посмотреть сообщение
Первая запись - единственный способ инициализации константных и
ссылочных полей класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int x = 1;
 
class Class
{
    const int y = x;
    int& t = x;
};
 
int main()
{
    Class x;
}
1
20.11.2016, 14:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 14:28
Помогаю со студенческими работами здесь

с www и без оного
Интересует, для Яндекса, Гугля, Яху, ВебАльты и прочих поисковиков какая разница указан ли www в...

В чем разница в объявлении переменной через new или без него?
В чем разница использования (C#) двух вариантов объявления переменной х: int x; x=5; и ...

Какая разница между невычисленным списком и списком?
Какая разница между невычисленным списком и списком? Я немного не врубаюсь прост. (defvar x...

Какая разница в инициализации?
Есть класс: class CSomeClass { CSomeClass(); private: bool isState1, isState2; }; ...

Конструктор со списком инициализации членов
1) Какой смысл применять синтаксис конструктора со списком инициализации членов class A{...

Разница в инициализации указателя на функцию
void f(int x) { std :: cout &lt;&lt; x; } int main() { void (*pf1)(int) = f; void...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru