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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
#1

Вопрос про конструктор класса по умолчанию - C++

29.10.2011, 18:32. Просмотров 2583. Ответов 50
Метки нет (Все метки)

http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg
Пункт первый не могу немного понять.Т.е получается,что всегда лучше создавать самому конструктор класса ?

Не по теме:

Ппц,как так можно книги выпускать.Сплошные опечатки,пропуски букв,не полный перевод комментариев...

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 18:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про конструктор класса по умолчанию (C++):

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Вопрос про конструктор - C++
цитата исходного кода из книги: class stock{ ... public: stock(); //Типа объявление конструктора по умолчанию чтоли... ...

Вопрос про конструктор - C++
Обязательно ли делать конструктор по умолчанию для класса, экземпляр которого входит в другой класс? Например так: class Class2 ...

Вопрос про конструктор и инициализвцию - C++
class test { int a; char name; string name2; public: test(int a,char* name, ....) : a(a), .....{} }; если стринг как...

Cделать конструктор по умолчанию и копирования для класса - C++
Вот у меня класс строка: class strg { char *str; int len; public: strg(); strg(const strg &); }; реализация:

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен - C++
#include <iostream> class A {}; int main() { A i; A j(i); return 0;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.10.2011, 17:18 #31
C++
1
2
3
4
5
6
7
8
9
10
   Cl(const std::initializer_list<int>& lst)
   {
      if (lst.size() != 3)
      {
         throw std::runtime_error("Wrong number of arguments");
      }
      value1 = *lst.begin();
      value2 = *(lst.begin() + 1);
      value3 = *(lst.begin() + 2);
   }
Полагаю запутал тем, что называю этот тип списком инициализации. std::initializer_list<T> я имел ввиду конечно же.
Сыроежка
Заблокирован
30.10.2011, 17:25 #32
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Сыроежка, ну в это я въехал.
Я просто вот это замечание из книги к первому пункту немного не понимаю: Неиницированная переменная обычно содержит значение -"мусор"
Например,неинициализированная целая переменная может содержать -858993460,что в большинстве программ будет ,вероятно недопустимым значением для данной переменной .

Вот это относится к ситуации,когда я попытаюсь ,не объявив конструктор самостоятельно,задать значение переменной класса при создании ?
Я вам уже ответил на этот вопрос, почему вы снова переспрашиваете?! Читайте вниматенльно,что вам я пишу.
Bers
Заблокирован
30.10.2011, 17:28 #33
Цитата Сообщение от ForEveR Посмотреть сообщение
Полагаю запутал тем, что называю этот тип списком инициализации. std::initializer_list<T> я имел ввиду конечно же.
ни разу вы не педагог)
Ладно, проще просто прошмуглить, что за std::initializer_list<int> такой.
Однозначно, я не вижу его практическую пользу. По-моему, ток запутывает.
Сыроежка
Заблокирован
30.10.2011, 17:28 #34
Цитата Сообщение от ForEveR Посмотреть сообщение
iluxa1810, В только что объявленных переменных ПОД типов. Или же если переменная - объект класса, а в нем есть под-типы, но нет конструктора по умолчанию.
Ну если не знаете С++, то уж лучше бы помолчали! Как надоели такие доморощенные "эксперты"!

Неявно объявленный компилятором конструктор по умолчанию не инициализирует фундментальные типы!
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.10.2011, 17:32 #35
Сыроежка,
Неявно объявленный компилятором конструктор по умолчанию не инициализирует фундментальные типы!
Товарищ "эксперт", я где-то сказал обратное?

Добавлено через 42 секунды
Bers, Нуу...

C++
1
std::vector<int> vec = {1,2,3,4};
Неудобно?
Сыроежка
Заблокирован
30.10.2011, 17:34 #36
Цитата Сообщение от ForEveR Посмотреть сообщение
Сыроежка,

Товарищ "эксперт", я где-то сказал обратное?

Добавлено через 42 секунды
Bers, Нуу...

C++
1
std::vector<int> vec = {1,2,3,4};
Неудобно?
Вы даже сами не понимаете,что пишите! Причем здесь POD типы?!!! Вы хотя бы выучите, что такое 1) фундаментальные типы, 2) агрегаты; 3) POD -структуры!

А самое главное посмотрите, чем агрегаты отличаются от POD структур!

Когда это выучите, то не будете писать всякий бред!
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.10.2011, 17:36 #37
Сыроежка, Читать учись. Второе сообщение было адресовано не тебе. И ответ был не на твой вопрос.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 17:37 #38
Цитата Сообщение от Сыроежка Посмотреть сообщение
POD -структуры!
POD типами могут быть не только структуры но и классы
Bers
Заблокирован
30.10.2011, 17:40 #39
Цитата Сообщение от ForEveR Посмотреть сообщение
Неудобно?
У меня такое не компилируется.

Но дело даже не в этом. Дело в том, что идеологически, объект конструируется согласно заданным параметрам. И не может быть сконструирован как то "не по правилам".

Тем более, когда заходит речь о конструкторах, важно что бы последние были безопасными.

Предположим, что мой вектор не умеет хранить более 4 элементов (велосипед). А я попытаюсь списками запихать в него больше. Что будит? Исключения в конструкторе вещь не хорошая...

Конкретные конструкторы позволяют построить объект конкретно безопасно. Сохраняя таким образом инвариант класса.

Любая попытка сконструировать объект с кривыми стартовыми параметрами должна пофикситься ещё на этапе компиляции, а не в рантайме...
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.10.2011, 17:42 #40
Сыроежка,
Arithmetic types (3.9.1), enumeration types, pointer types, pointer to member types (3.9.2), std::nullptr_-
t, and cv-qualified versions of these types (3.9.3) are collectively called scalar types. Scalar types, POD
classes (Clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called
POD types. Scalar types, trivially copyable class types (Clause 9), arrays of such types, and cv-qualified
versions of these types (3.9.3) are collectively called trivially copyable types. Scalar types, trivial class types
(Clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called trivial
types. Scalar types, standard-layout class types (Clause 9), arrays of such types and cv-qualified versions of
these types (3.9.3) are collectively called standard-layout types.
Bers
Заблокирован
30.10.2011, 17:43 #41
ForEveR, я считаю, что удобство работы с классом обязан обеспечивать элегантный интерфейс класса. И уж точно, безопасность работы не должна приносится в жертву удобствами
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.10.2011, 17:47 #42
Bers, Возможно. Я ведь просто пример привел. А в стандартных контейнерах конструкторы с этим типом аргумента безопасны.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
      vector(initializer_list<value_type> __l,
         const allocator_type& __a = allocator_type())
      : _Base(__a)
      {
    _M_range_initialize(__l.begin(), __l.end(),
                random_access_iterator_tag());
      }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Called by the second initialize_dispatch above
      template<typename _ForwardIterator>
        void
        _M_range_initialize(_ForwardIterator __first,
                _ForwardIterator __last, std::forward_iterator_tag)
        {
      const size_type __n = std::distance(__first, __last);
      this->_M_impl._M_start = this->_M_allocate(__n);
      this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
      this->_M_impl._M_finish =
        std::__uninitialized_copy_a(__first, __last,
                    this->_M_impl._M_start,
                    _M_get_Tp_allocator());
    }
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 17:47 #43
Цитата Сообщение от Bers Посмотреть сообщение
Предположим, что мой вектор не умеет хранить более 4 элементов (велосипед). А я попытаюсь списками запихать в него больше. Что будит? Исключения в конструкторе вещь не хорошая...
Конкретные конструкторы позволяют построить объект конкретно безопасно. Сохраняя таким образом инвариант класса.
Любая попытка сконструировать объект с кривыми стартовыми параметрами должна пофикситься ещё на этапе компиляции, а не в рантайме...
Bers, такие случаи называются "сам дурак", алгоритмы STL тоже не застраховывают если им передать begin и end разных контейнеров
Bers
Заблокирован
30.10.2011, 17:51 #44
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Возможно. Я ведь просто пример привел. А в стандартных контейнерах конструкторы с этим типом аргумента безопасны.
Ну вот, кроме как для контейнеров, мне что-то даже в голову не приходит, как ещё можно для классов использовать списки инициализации?

Можно конечно юзать список вместо кучки однотипных аргументов, да. Но такая запись будит не очевидна (я вот так до сих пор ещё и не въехал в работу механизма)

У меня, если класс конструируется при помощи достаточно большого количества аргументов, то я просто делаю отдельную структурку с полями-аргументами, и делаю конструктор с параметром - этой структурой. Все сразу становится ясно, и понятно. Легко читается, и сопровождается.
Сыроежка
Заблокирован
30.10.2011, 17:55 #45
Цитата Сообщение от Jupiter Посмотреть сообщение
POD типами могут быть не только структуры но и классы
Да я так написал, потому что ранее этот доморощенный "эксперт" заявил, что POD - это не классы! То есть пишется всякий бред, нга который уже трудно отвечать полно, так как надо начинать с азов. Этот "эксперт" даже не знает, чем агрегат отличается от POD. Как говорится, он слышал звон, да не знает,где он. И вот такие "эксперты" вешают всякую "лапшу на уши" начинающим программистам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 17:55
Привет! Вот еще темы с ответами:

Для класса "R" не существует конструктор по умолчанию - C++
Подскажите, что не так. И как здесь пользоваться cout? Чтобы вывести с. Просто я вбивал, а он не работает. И где его вообще вбивать нужно? ...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

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


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

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

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