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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.60
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
21.02.2010, 21:37     Конструктор со списком инициализации членов #1
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;}
}
?

Просто другой синтаксис? Или что то большее?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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;}
}
Перед входом в конструктор класса вызывает конструктор по умолчанию для каждого члена класса. Затем в контрукторе через оператор присваивания инициализируем члены. Таким образом, по сути, во втором случае конструктор по умолчанию для каждого члена отработал зря.
Sergey_s
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;
}
Так же первым способом обязательно должны инициализироваться ссылки и константы, объявленные в классе.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,427
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)
}
?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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");
}
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2010, 22:14     Конструктор со списком инициализации членов #6
insideone, угу
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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);
}
Sergey_s
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 подхватил.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2010, 23:09     Конструктор со списком инициализации членов #9
Цитата Сообщение от outoftime Посмотреть сообщение
не сконструировался а обьявился
А вот и нет. Как раз и объявился и сконструировался.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
21.02.2010, 23:10     Конструктор со списком инициализации членов #10
Кто-то знает как заставить работать ЭТО: Конструктор со списком инициализации членов
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,427
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 {}
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 716
21.02.2010, 23:14     Конструктор со списком инициализации членов #12
не читал че выше писали но даже если подумать над названием " список инициализации" становится понятно что члены класса объявленные как ссылки или константы мы можем инициализировать только в этом списке ибо предположим константа на то и является константой чтобы инициализироваться разок.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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"
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
21.02.2010, 23:28     Конструктор со списком инициализации членов #14
Добавлю к словам Андрейки,
так же параметры инициализации используются если конструктору производного класса
необходимо явно(с пропиской этого вызова программистом)вызвать конструктор базового класса, а так часто бывает особенно если присутствую конструкторы с параметрами.

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

Добавлено через 2 минуты
А в чём вообще проблема вопроса, дайте поробую отгадать: в отсутствии нужной литературы...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,427
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");
}
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
21.02.2010, 23:30     Конструктор со списком инициализации членов #16
классе объявлен объект
Даже переменная типа int это объект, набор из четырёх байт.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2010, 23:36     Конструктор со списком инициализации членов
Еще ссылки по теме:

C++ Конструктор со списком инициализации: найти ошибку в коде
C++ Конструктор копирования при инициализации
Ошибка при инициализации вектора списком C++

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
21.02.2010, 23:36     Конструктор со списком инициализации членов #17
да, что-то у меня в голове c++ & c# перепутались))
Yandex
Объявления
21.02.2010, 23:36     Конструктор со списком инициализации членов
Ответ Создать тему
Опции темы

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