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

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

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

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

29.10.2011, 18:32. Просмотров 2476. Ответов 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++
Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор C++
C++ Вопрос про конструктор
C++ Конструктор производного класса требует конструктор предка
Конструктор класса не видит конструктор по умолчанию другого класса C++
C++ Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
29.10.2011, 18:36     Вопрос про конструктор класса по умолчанию #2
Цитата Сообщение от iluxa1810 Посмотреть сообщение
http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg
Пункт первый не могу немного понять.Т.е получается,что всегда лучше создавать самому конструктор класса ?

Не по теме:

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

Что вам непонятно, и почему вы сделали такой вывод? Но тем не менее лучше конечно всегда создавать конструктор по умолчанию, так как создаваемый комплятором неявно конструктор по умолчанию может не инициализировать члены класса.

Конструктор по умолчанию, создаваемый компилятором, соответсвует конструктор, который бы вы сами написали, и у которого не будет списка инициализации и будет пустое тело.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
29.10.2011, 18:41  [ТС]     Вопрос про конструктор класса по умолчанию #3
Просто по примеру ,мне кажется ,что неопределенный конструктор может привести к крашу программы
Сыроежка
Заблокирован
29.10.2011, 18:47     Вопрос про конструктор класса по умолчанию #4
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Просто по примеру ,мне кажется ,что неопределенный конструктор может привести к крашу программы
Я не разглядывал ваш снимок книги, поэтому не могли бы выложить пример здесь, чтобы можно было по существу ответить вам.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
29.10.2011, 18:53  [ТС]     Вопрос про конструктор класса по умолчанию #5
Например,неинициализированная целая переменная может содержать -858993460,что в большинстве будет программ,будет ,вероятно недопустимым значением для данной переменной .
Как вот это понимать и как это повлияет на работу программы?
Сыроежка
Заблокирован
29.10.2011, 18:57     Вопрос про конструктор класса по умолчанию #6
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Например,неинициализированная целая переменная может содержать -858993460,что в большинстве будет программ,будет ,вероятно недопустимым значением для данной переменной .
Как вот это понимать и как это повлияет на работу программы?
Я вам об этом и написал, что конструктор, создаваемый неявно компилятором, не инициализирует члены класса. Поэтому желательно писать свои конструкторы.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
29.10.2011, 19:03  [ТС]     Вопрос про конструктор класса по умолчанию #7
Сыроежка, Контруктор,как я понял из книги позволяет при объявлении переменной класса задать ей значения при ее объявлении,а если допустим я не хочу задавать ей значения при объявлении.По влияет ли в таком случае этот конструктор по умолчанию на работу программы?
Если я не объявлю конструктор сам,а потом попытаюсь присвоить переменной класса значение,то произойдет ошибка?
Сыроежка
Заблокирован
29.10.2011, 19:27     Вопрос про конструктор класса по умолчанию #8
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Сыроежка, Контруктор,как я понял из книги позволяет при объявлении переменной класса задать ей значения при ее объявлении,а если допустим я не хочу задавать ей значения при объявлении.По влияет ли в таком случае этот конструктор по умолчанию на работу программы?
Если я не объявлю конструктор сам,а потом попытаюсь присвоить переменной класса значение,то произойдет ошибка?
Конструктор по умолчанию, как правильно написано в приведенной вами ссылке, является любой конструктор, который можно вызвать без аргументов.

Это совершенно не означает, что конструктор по умолчанию не может иметь параметров. Но это означает, если у конструктора есть параметры, то, чтобы он был конструктором по умолчанию, все его параметры должны иметь аргументы по умолчанию.

Компилятор неявног создает конструктор по умолчанию без параметров, а это означает, что никакое значение при создании объекта класса не передается. Вы не можете создать объект, передав ему значение.

Рассмотрим простой пример.

C++
1
2
3
4
5
6
7
8
9
10
11
struct A
{
   A( int i = 0 ) : x( i ) {}
   int x;
};
 
int main()
{
   A a1;
   A a2( 10 );
}
В этом пример мы явно определяем конструктор по умолчанию. Заметьте, что он имеет один параметр. Но тем не менее может быть вызван без аргументов. Тогда будет использоваться аргумент по умолчанию равным 0.

Поэтому мы можем создать объекты первым и вторым способом, задав конкретное значение взамен значения по умолчанию.

Ежели мы сами не определим конструктор для этого класса, то компилятор его определит за нас со следующим определением
C++
1
inline A::A() {}
Поэтому мы не можем его использовать при определении объекта a2 из нашего примера, так как создание объекта a2 требует передачи аргумента конструктора, а у объявленного по умолчанию конструктора вообще нет параметров. Поэтому компилятор должен сообщить об ошибке.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
29.10.2011, 19:51  [ТС]     Вопрос про конструктор класса по умолчанию #9
Сыроежка, ну в это я въехал.
Я просто вот это замечание из книги к первому пункту немного не понимаю: Неиницированная переменная обычно содержит значение -"мусор"
Например,неинициализированная целая переменная может содержать -858993460,что в большинстве программ будет ,вероятно недопустимым значением для данной переменной .

Вот это относится к ситуации,когда я попытаюсь ,не объявив конструктор самостоятельно,задать значение переменной класса при создании ?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.10.2011, 20:13     Вопрос про конструктор класса по умолчанию #10
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Вот это относится к ситуации,когда я попытаюсь ,не объявив конструктор самостоятельно,задать значение переменной класса при создании ?
Вы имеете в виду это?
C++
1
 A a = { value1, ..., valuen };
В этом случае зададутся значения value1...valuen, а не мусор.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
30.10.2011, 13:41  [ТС]     Вопрос про конструктор класса по умолчанию #11
Что вообще называется неиницированной переменной и как она связана с конструктором по умолчанию ?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.10.2011, 16:07     Вопрос про конструктор класса по умолчанию #12
iluxa1810, Неинициализированной... Любая переменная, которая не инициализирована. У POD типов нету конструкторов, т.к. они не являются классами. Поэтому

C++
1
2
int a; //В a лежит мусор
std::string с; // Вызвался конструктор по умолчанию для std::string и корректно провел инициализцию.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
30.10.2011, 16:15  [ТС]     Вопрос про конструктор класса по умолчанию #13
Т.е получается,что в только что объявленный переменных переменных лежат случайные значения?
Понятно,спс.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.10.2011, 16:17     Вопрос про конструктор класса по умолчанию #14
iluxa1810, В только что объявленных переменных ПОД типов. Или же если переменная - объект класса, а в нем есть под-типы, но нет конструктора по умолчанию.
Bers
Заблокирован
30.10.2011, 16:22     Вопрос про конструктор класса по умолчанию #15
Цитата Сообщение от Chelioss Посмотреть сообщение
Вы имеете в виду это?
Код C++
1
*A a = { value1, ..., valuen };
В этом случае зададутся значения value1...valuen, а не мусор.
Рассмотрим пример:
C++
1
2
3
4
5
6
7
    struct STest { int a; };
    STest test = {5}; //можно. Так как данные-члены паблики
 
    class CTest { int a; };
    CTest test1 = {5}; //нельзя. Так как данные-члены приватные 
    //error C2552: test1: инициализация не агрегированных 
    //данных с помощью списка инициализации не допускается
Думаю, очивидно, что подобная инициализация данны-членов для класса (а не структуры) - ущербна.

Мораль: не хотите проблем, и быдлокода на с++, пишите в рамках парадигмы с++, а не сишного суржика.
Каноническая форма записи класса: всегда есть конструктор по умолчанию, копирующий, деструктор, безопасный метод clear();
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
30.10.2011, 16:25     Вопрос про конструктор класса по умолчанию #16
Bers
Это я знаю.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.10.2011, 16:29     Вопрос про конструктор класса по умолчанию #17
Bers, Не скажу, что ущербна.
Все же не спроста списки инициализации придумали.

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
#include <iostream>
#include <initializer_list>
#include <stdexcept>
 
class Cl
{
public:
   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);
   }
private:
   int value1;
   int value2;
   int value3;
};
 
int main()
{
   Cl c = {1,2,3};
}
Bers
Заблокирован
30.10.2011, 16:36     Вопрос про конструктор класса по умолчанию #18
ForEveR, не компилируется по двум причинам:

1. В моей старенькой студии отсутствует #include <initializer_list>
2. error C2552: c: инициализация не агрегированных данных с помощью списка инициализации не допускается

Попытка инициализации приватных членов.

Я не могу точно сказать как происходит инициализация в приведенном вами коде, но подозреваю, что такое не по стандарту. Элементарно, снаружи класса нет доступа к приватным членам. Ага.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.10.2011, 16:39     Вопрос про конструктор класса по умолчанию #19
Bers, http://liveworkspace.org/code/8b6d3c...19dcd0707f53e2
1. Код абсолютно корректен и компилируется.
2. Код полностью соответствует текущему стандарту языка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 16:41     Вопрос про конструктор класса по умолчанию
Еще ссылки по теме:

C++ Конструктор по умолчанию
Конструктор класса по умолчанию: код компилируется, хотя по идее не должен C++
C++ Cделать конструктор по умолчанию и копирования для класса
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?
C++ Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
30.10.2011, 16:41     Вопрос про конструктор класса по умолчанию #20
Цитата Сообщение от ForEveR Посмотреть сообщение
2. Код полностью соответствует текущему стандарту языка.
Хотите сказать, что нынче можно инициализировать данные члены класса СНАРУЖИ?
Нарушение инкапсуляции?
Yandex
Объявления
30.10.2011, 16:41     Вопрос про конструктор класса по умолчанию
Ответ Создать тему
Опции темы

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