Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/79: Рейтинг темы: голосов - 79, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
1

Конструктор со списком инициализации членов

21.02.2010, 21:37. Показов 15189. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1) Какой смысл применять синтаксис конструктора со списком инициализации членов
C++
1
2
3
class A{
A():_name(0),_balance( 0.0 ), _acct_nmbr( 0 ){}
}
вместо
C++
1
2
3
class A{
A():{_name=0;_balance=0.0; _acct_nmbr=0;}
}
?

Просто другой синтаксис? Или что то большее?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2010, 21:37
Ответы с готовыми решениями:

Конструктор со списком инициализации: найти ошибку в коде
здравствуйте, есть вот такой кусок шаблонного класса и инициализирующий конструктор этого класса: ...

Копирующий конструктор в списке инициализации членов класса
Добрый день. Сегодня обнаружил кое-что для себя странное и непонятное. В общем-то смотрим код:...

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

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

16
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
21.02.2010, 21:46 2
SkyN, смысл применять списки инициализации есть.
C++
1
2
3
class A{
A():_name(0),_balance( 0.0 ), _acct_nmbr( 0 ){}
}
Вызываем для каждой переменной конструктор с переданным значением. Таким образом инициализируем их.

C++
1
2
3
class A{
A():{_name=0;_balance=0.0; _acct_nmbr=0;}
}
Перед входом в конструктор класса вызывает конструктор по умолчанию для каждого члена класса. Затем в контрукторе через оператор присваивания инициализируем члены. Таким образом, по сути, во втором случае конструктор по умолчанию для каждого члена отработал зря.
1
1 / 1 / 0
Регистрация: 21.02.2010
Сообщений: 5
21.02.2010, 21:57 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Так же первый способ обязателен если у базового класса есть конструктор с параметрами.
class MyClass {
private:
int a;
public:
MyClass(int p): a(p){}
};
class podClass: public MyClass {
int b;
public:
//Обязательный вызов конструктора базового класса.
podClass(int d) :MyClass(d),b(d) {}
};
 
int main(){
 
    return 0;
}
Так же первым способом обязательно должны инициализироваться ссылки и константы, объявленные в классе.
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.02.2010, 21:58 4
Т.е.
C++
1
2
3
4
5
6
class A{
   SomeType B;
};
int main(){
   A a; // a.B сконструировался по умолчанию
}
C++
1
2
3
4
5
6
7
class A{
   SomeType B;
   A():B(3){};
};
int main(){
   A a; // a.B сконструировался SomeType(3)
}
?
1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.02.2010, 22:11 5
Хороший вопрос, я для ясности добавлю свой код и осмелюсь спросить как его поправить, чтобы конструкторы верно работали:
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
34
35
36
37
38
39
40
41
#include <iostream>
#include <conio.h>
#include <windows.h>
 
using namespace std;
 
ostream &operator << (ostream &out, const char *text)
{
    int n = strlen(text);
    char *s = new char[ n+1 ];
    CharToOem(text, s);
    out.write(s, n);
    return out;
}
 
class vector3D
{
private:
    int a, b, c;
public:
    vector3D(int &a, int &b, int &c) : this.a = a, this.b = b, this.c = c {}
    vector3D(int &a, int &b) : this(a, b, 0) {}
    vector3D(int &a) : this(a, 0, 0) {}
    vector3D() : this(0, 0, 0) {}
    void Show()
    {
        cout << "Координаты вектора:" << endl;
        cout << "(" << a << "," << b << "," << c << ")" << endl;
    }
}
  
int main()
{ 
    vector3D a = vector3D(1, 2, 3),
             b = vector3D(1, 2),
             c = vector3D();
    a.Show();
    b.Show();
    c.Show();
    system ("psuae");
}
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
21.02.2010, 22:14 6
insideone, угу
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.02.2010, 22:15 7
Цитата Сообщение от insideone Посмотреть сообщение
class A
{
SomeType B;
A():B(3){};
};
int main(){
A a; // a.B сконструировался по умолчанию
}
не сконструировался а обьявился, значение ему ты так и не присвоил, конструктор класа А в мейне не получил значение для иницыализации, верно будет:
C++
1
2
3
4
int main()
{
   A a(3);
}
0
1 / 1 / 0
Регистрация: 21.02.2010
Сообщений: 5
21.02.2010, 23:05 8
Для outoftime :
C++
1
2
3
4
5
6
7
8
9
class A
{
SomeType B;
A():B(3){};
};
int main(){
A a; //  B сконструировался (3)
return 0;
}
Всё правильно если SomeType имеет конструктор с параметрами.

Добавлено через 2 минуты
не получил значение для иницыализации
Здесь и получать не надо было, так как вызван констктруктор по умолчанию класса A,
а он проинициализировал по умолчанию объект B вызвав конструктор с параметрами класса SOmeType

Добавлено через 28 минут
Заметил один нюанс: public надо ставить иначи вызвать конструктор будет не возможно,
из за остутствия доступа к нему.
C++
1
2
3
4
5
6
class A
{
public:
SomeType B;
A():B(3){};
};
Добавлено через 2 минуты
SkyN написал без public а insideone подхватил.
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
21.02.2010, 23:09 9
Цитата Сообщение от outoftime Посмотреть сообщение
не сконструировался а обьявился
А вот и нет. Как раз и объявился и сконструировался.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.02.2010, 23:10 10
Кто-то знает как заставить работать ЭТО: https://www.cyberforum.ru/post560631.html
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.02.2010, 23:13 11
2 outoftime принимай как копии и сделай параметры по умолчанию

C++
1
vector3D(int a = 0, int b = 0, int c = 0) : this.a = a, this.b = b, this.c = c {}
0
425 / 229 / 87
Регистрация: 25.03.2009
Сообщений: 744
21.02.2010, 23:14 12
не читал че выше писали но даже если подумать над названием " список инициализации" становится понятно что члены класса объявленные как ссылки или константы мы можем инициализировать только в этом списке ибо предположим константа на то и является константой чтобы инициализироваться разок.
1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.02.2010, 23:22 13
C++
1
vector3D(int a = 0, int b = 0, int c = 0) : this.a(a), this.b(b), this.c(c) {}
на это выдает ошибку:
1. 21 C:\Documents and Settings\Администратор\Рабочий стол\help.cpp expected identifier before "this"
2. 21 C:\Documents and Settings\Администратор\Рабочий стол\help.cpp expected `(' before "this"
3. 21 C:\Documents and Settings\Администратор\Рабочий стол\help.cpp expected `{' before "this"
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
21.02.2010, 23:28 14
Добавлю к словам Андрейки,
так же параметры инициализации используются если конструктору производного класса
необходимо явно(с пропиской этого вызова программистом)вызвать конструктор базового класса, а так часто бывает особенно если присутствую конструкторы с параметрами.

Также параметры инициализации используются когда в классе объявлен объект другого класса:
если для создания объявленного внутри класса объекта требуется вызвать конструктор с параметрами.

Добавлено через 2 минуты
А в чём вообще проблема вопроса, дайте поробую отгадать: в отсутствии нужной литературы...
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
21.02.2010, 23:30 15
2 outoftime Хм, ну вот так у меня запустилось
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
class vector3D
{
private:
    int a, b, c;
public:
    vector3D(int na = 0, int nb = 0, int nc = 0) : a(na), b(nb), c(nc) {}
 
    void Show()
    {
        cout << "Координаты вектора:" << endl;
        cout << "(" << a << "," << b << "," << c << ")" << endl;
    }
};
  
int main()
{ 
    vector3D a = vector3D(1, 2, 3),
             b = vector3D(1, 2),
             c = vector3D();
    a.Show();
    b.Show();
    c.Show();
    system ("psuae");
}
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
21.02.2010, 23:30 16
классе объявлен объект
Даже переменная типа int это объект, набор из четырёх байт.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.02.2010, 23:36 17
да, что-то у меня в голове c++ & c# перепутались))
0
21.02.2010, 23:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2010, 23:36
Помогаю со студенческими работами здесь

Конструктор инициализации
Как передать параметры конструктору, если объект класса определен как указатель? #include...

Реализовать конструктор инициализации
Во всех заданиях необходимо реализовать конструктор инициализации (один или несколько) и...

Конструктор копирования при инициализации
При инициализации одного объекта через другой вызывается конструктор копирования, под динамическую...

Конструктор. Наследование. Список инициализации
Если есть класс, который наследует другой класс, то как задать для конструктора список...


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

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