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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.60
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2010, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор со списком инициализации членов (C++):

Конструктор со списком инициализации: найти ошибку в коде - C++
здравствуйте, есть вот такой кусок шаблонного класса и инициализирующий конструктор этого класса: std::allocator<T> data; typename...

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

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

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

Конструктор инициализации - C++
Как передать параметры конструктору, если объект класса определен как указатель? #include <iostream> using namespace...

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

16
Vourhey
Почетный модератор
6482 / 2256 / 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;}
}
Перед входом в конструктор класса вызывает конструктор по умолчанию для каждого члена класса. Затем в контрукторе через оператор присваивания инициализируем члены. Таким образом, по сути, во втором случае конструктор по умолчанию для каждого члена отработал зря.
1
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;
}
Так же первым способом обязательно должны инициализироваться ссылки и константы, объявленные в классе.
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
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
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2010, 22:14 #6
insideone, угу
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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
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 подхватил.
1
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.02.2010, 23:09 #9
Цитата Сообщение от outoftime Посмотреть сообщение
не сконструировался а обьявился
А вот и нет. Как раз и объявился и сконструировался.
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.02.2010, 23:10 #10
Кто-то знает как заставить работать ЭТО: Конструктор со списком инициализации членов
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
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
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
21.02.2010, 23:14 #12
не читал че выше писали но даже если подумать над названием " список инициализации" становится понятно что члены класса объявленные как ссылки или константы мы можем инициализировать только в этом списке ибо предположим константа на то и является константой чтобы инициализироваться разок.
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
21.02.2010, 23:28 #14
Добавлю к словам Андрейки,
так же параметры инициализации используются если конструктору производного класса
необходимо явно(с пропиской этого вызова программистом)вызвать конструктор базового класса, а так часто бывает особенно если присутствую конструкторы с параметрами.

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

Добавлено через 2 минуты
А в чём вообще проблема вопроса, дайте поробую отгадать: в отсутствии нужной литературы...
0
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,472
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2010, 23:30
Привет! Вот еще темы с ответами:

Список инициализации в конструктор C++11. Зачем? - C++
Обьясните зачем в с++11 сделали возможность инициализировать данные м помощью списка {} ? было вот так: CO o(1, 2, 3); ...

Конструктор. Наследование. Список инициализации - C++
Если есть класс, который наследует другой класс, то как задать для конструктора список инициализации? class CKub { private: ...

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

Ошибка при инициализации вектора списком - C++
В книге Страуструпа элементы вектора объявляются так vector&lt;int&gt; v = { 5 , 7 , 9 , 4 , 6 , 8 } ;В netbeans (linux ubuntu) ide выдаёт...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
21.02.2010, 23:30
Ответ Создать тему
Опции темы

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