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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 117, средняя оценка - 4.91
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
#1

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

09.09.2012, 20:23. Просмотров 15636. Ответов 24
Метки нет (Все метки)

1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию?
2) правильно ли утверждение,что списки инициализации можно заменить к.по умолчанию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 20:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию? (C++):

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Когда нужно использовать &ссылки ,а когда *указатели? - C++
Желательно с примерами

Когда использовать WinAPI, а когда функции языка? - C++
Не совсем понимаю, когда нужно использовать WinAPI в приложении, а когда функционал самого ЯП (С/С++). Для той же работы с файлами...

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

Объяснить (с примерами) для чего нужен RTTI, как и когда его можно и нужно использовать - C++
доброго времени суток. вопрос такой как я понял RTTI это свойсвто языка С++ которое было добавлено позднее его релиза, что бы...

Когда создается конструктор по умолчанию? - C++
Здравствуйте, товарищи! Прочитал тут книгу "Ассемблер и дизасеммблирование" Пирогова и открыл для себя такую вещь, что конструктор...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.09.2012, 20:32 #2
Уточните-ка, какие именно списки инициализации вы имеете ввиду? Списки инициализации объектов? Или список инициализации конструктора?
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
09.09.2012, 20:43  [ТС] #3
э..Наверное списки инициализации объектов...
Вот это я имею в виду:
C++
1
2
3
4
5
6
7
8
9
10
11
class Foo
{
public:
    Foo(int i, int j = 0)
        :m_i(i)
        ,m_j(j)
    {
    }
private:
    int m_i, m_j;
};
Ну а списки инициализации конструкторов, это же тоже самое в принципе?
2)Вот инициализация конструктора,да ?:
C++
1
2
3
4
5
6
7
8
9
10
class MyFile
{
public:
    MyFile():m_pFile(NULL)
    {}
 
    ~MyFile()
    {
        Close();
    }
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.09.2012, 20:51 #4
Нет, всё это списки инициализации конструкторов. Список инициализации объекта вот, например:
C++
1
2
3
4
5
6
7
8
9
10
struct Object
{
    int a;
    double b;
    char c;
};
 
...
 
Object obj = {42, 3.14, 'x'};
Ну а теперь ответьте на вопрос: как можно список инициализации заменить конструктором по умолчанию? И как можно воду заменить жареной картошкой? Это я к тому, что вещи это разные. Либо я не понял вопроса. Попробуйте пояснить, что вы подразумеваете под подобной заменой?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
09.09.2012, 20:57 #5
Цитата Сообщение от RASHFor Посмотреть сообщение
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию?
2) правильно ли утверждение,что списки инициализации можно заменить к.по умолчанию?
Список инициализации, например, - единственный выход для инициализации не статических констант класса. Их можно объявить, в теле объявления (сигнатуре) класса, а определить в конструкторе, применив инициализацию списком.
зы для случая приведенного Вами, можно легко провести инициализацию в теле конструктора присвоением. И компилятор это примет. Тут нет разницы. А вот константу так инициализировать не даст.)
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.09.2012, 21:03 #6
IGPIGP, да банальнейший пример - вызов конкретного конструктора базового класса можно сделать только в списке инициализации.
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
09.09.2012, 21:09  [ТС] #7
Спасибо.И всё же.))
C++
1
2
3
4
5
6
7
8
9
10
11
class Foo
{
public:
    Foo(int i, int j = 0)//Это конструктор?(и почему int j = 0 ,а int i только объявленно и не присвоенно значение? )
        :m_i(i)//это список инициализации?
        ,m_j(j)
    {
    }
private:
    int m_i, m_j;
};
П.С Вопросы скорей всего тупые и вас бесят,но я так быстрее пойму,если буду знать ответы.Спс,за терпение.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.09.2012, 21:14 #8
RASHFor, да, это конструктор. С двумя параметрами. Один из них (второй) имеет значение по умолчанию. Это значит, что конструктор может быть вызван как с одним, так и с двумя аргументами. В первом случае вызов Foo bar(10) эквивалентен вызову Foo bar(10, 0) (если второй аргумент явно не указан, будет передано его значение по умолчанию). После двоеточия через запятую идёт список инициализации конструктора, по факт - вызов конструкторов других объектов.
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
09.09.2012, 21:18  [ТС] #9
Спасибо,вроде въехал.трошки.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 21:34 #10
Тут почитайте: Двоеточие в конструкторе
Явное наследование конструкторов
schoolboy_
1 / 1 / 0
Регистрация: 02.03.2013
Сообщений: 59
31.01.2015, 21:06 #11
Как, используя список инициализации, организовать проверку передаваемых в конструкторе значений?
Скажем, если значение больше нуля, то этим значением инициализируем поле класса, иначе нет.
C++
1
2
3
4
5
6
7
8
9
10
11
class Foo
{
public:
    Foo(int i, int j = 0)//Это конструктор?(и почему int j = 0 ,а int i только объявленно и не присвоенно значение? )
        :m_i(i)//это список инициализации?
        ,m_j(j)
    {
    }
private:
    int m_i, m_j;
};
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
31.01.2015, 21:31 #12
Цитата Сообщение от IGPIGP Посмотреть сообщение
писок инициализации, например, - единственный выход для инициализации не статических констант класса.
неужели?

http://rextester.com/RLMP92136

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Title of this code
//g++  4.8.2
 
#include <iostream>
 
 
struct example
{
    void view()const { std::cout<<"value = "<< value<<'\n'; }
    const int value = 10;
    
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    example().view();
}
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
31.01.2015, 21:53 #13
Цитата Сообщение от hoggy Посмотреть сообщение
неужели?
hoggy, больше года как это обсуждалось.
Константа встроенного типа с инициализирующим значением не передаваемым в конструктор становится угрожающе статической. Ведь инициализируя её литералом или другой константой Вы делаете её одинаковой для всех экземпляров. Хотя каждый будет иметь свою копию в отличие от настоящей статической константы. Я затрудняюсь определить пол такой переменной. Но может где-то и нужно такое. Расскажите где.
Я не имею большого опыта и хотел сказать о, примерно, таком случае:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
class NoStaticConst{
public:
NoStaticConst(int);
const int a;
};
NoStaticConst::NoStaticConst(int a_)
:a(a_)//ok однако закомментируйте эту строку и раскомментируйте ту что сейчас закомментирована ниже
{
//a=a_; //не получится
}
int main()
{
NoStaticConst a(5);
cout<<a.a<<endl;
system("pause");
    return 0;
}
hoggy
6535 / 2715 / 469
Регистрация: 15.11.2014
Сообщений: 5,993
Завершенные тесты: 1
31.01.2015, 22:03 #14
Цитата Сообщение от IGPIGP Посмотреть сообщение
Константа встроенного типа с инициализирующим значением не передаваемым в конструктор становится угрожающе статической.
"угрожающе статической" - это что, определение гуманитариев?

Она была и остается обычным мембером класса.

Причем, совершенно не принципиально встроенный это тип, или нет:

http://rextester.com/TNHWV64207

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Title of this code
//g++  4.8.2
 
#include <iostream>
#include <functional>
 
 
struct example
{
    typedef std::function<void()>
        delegate;
    
    void view()const { std::cout<<"value = "<< value<<'\n'; }
    const int value = 10;
    
    const delegate hello = [](){ std::cout<<"Hello, world!\n";  };
};
 
int main()
{
    example().hello();
}
На самом деле все гораздо проще:
мемберы можно инициализировать не только в списках инициализации.

Вот и все.


Цитата Сообщение от IGPIGP Посмотреть сообщение
:a(a_)//ok однако закомментируйте эту строку и раскомментируйте ту что сейчас закомментирована ниже
{
//a=a_; //не получится
}
Ваше "не получится" - это присвоение, а не инициализация.

Очевидно, что раз мембер - константа, то присвоить ему новое значение уже нельзя.
Только к инициализации это вообще не имеет никакого отношения
schoolboy_
1 / 1 / 0
Регистрация: 02.03.2013
Сообщений: 59
31.01.2015, 22:05 #15
hoggy, ответте на мой вопрос, пожалуйста. Похоже, в данной ветке вы самый "прошаренный"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2015, 22:05
Привет! Вот еще темы с ответами:

Когда запускаю и ввожу параметры, то, в момент когда программа должна выполнять действие, пишет ошибку - C++
Недавно начали изучать c++. так как в школе не было программирования (преподу пофиг было) я в универе отстаю ;c Написал программу по...

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

Записать условия когда является истинным , когда: - C++
Записать условия когда является истинным , когда: целое N кратно четырем и не оканчивается нулем Привет всем вот мой код но он у меня...

Когда используется * перед указателями, а когда нет? - C++
Вообщем я запутался и не пойму, когда нужно перед указателем ставить &quot;*&quot;, а когда нет. Как я понял, &quot;*&quot; ставится перед указателем,...


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

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

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