Имя: Пароль:
IT
 
Зачем нужен пустой конструктор по-умолчанию C++?
0 Mits
 
28.01.12
05:11
Если он ничего не делает, а компилятор его добавляет.
1 Mits
 
28.01.12
05:27
думаю тут могут быть знатоки C++
2 ДенисЧ
 
28.01.12
05:41
чтобы можно было создать объект...
3 Mits
 
28.01.12
05:59
то есть компилятор не сможет создать объект без конструктора, это как-бы необходимый шаг, даже если конструктор пустой
4 Rie
 
28.01.12
06:57
(3) Если программист не определил конструктор в классе - то компилятор создаст конструктор (без параметров) для создания объектов этого класса.
Но мне кажется, вопрос в чём-то другом?
5 Mits
 
28.01.12
07:40
(4)вопрос зачем он это сделает
6 Rie
 
28.01.12
07:46
(5) А иначе возникнут проблемы с созданием
class B { int i; }
class D: B { int j; D() { j=0; } } /* при создании D надо вызвать конструктор для B - а его нет */
class C { B x; C() {} } /* x надо ведь как-то создать */

Но если программист определил свой конструктор - то будет использоваться тот, что определил программист.
7 Mits
 
28.01.12
10:05
вообщем это нужно компилятору, иначе бы он мог обходить такие ситуации
8 Mits
 
28.01.12
10:20
И еще один вопрос: у этого конструктора есть какое-то побочное действие?
9 Mikeware
 
28.01.12
10:20
(7) Да, собственно, и программа на С++ нужна тоже компилятору. Если нет программы на С++ - нахрена тогда нужен компилятор? :-)
10 Rie
 
28.01.12
10:25
(7) ???
Вообще-то всё это нужно программисту. В том числе и конструктор по умолчанию.

struct B { B() { cout<<"Wow!"; } };
struct D: B { int i; };
int main()
{ D x; }
11 Rie
 
28.01.12
10:26
+(10) Ну или
class B { private: B() {} }:
class D: public B { int i; }:
int main()
{ D x; }
12 Mits
 
28.01.12
10:27
Просто механизм конструктора по-умолчанию прозрачен для программиста, также как и кэш-память процессора.
13 Rie
 
28.01.12
10:27
(8) У _какого_? См. (10) - как работает конструктор по умолчанию для D.
14 Rie
 
28.01.12
10:28
(12) Да нет. Надо знать этот механизм (а в C++ он не так уж и прост; впрочем, а что в C++ сделано просто?)
15 Mits
 
28.01.12
10:31
(14)Сложность c++ в том, что этот язык дает полную свободу программисту и в тоже время это заставлет его делать все вручную. Хотя есть библиотеки STL и другие библиотеки.
16 Rie
 
28.01.12
10:34
(15) Используй другой язык :-)
17 Xapac
 
28.01.12
10:35
разрыв мозга просто.
"я теперь понял, что они не пересекаются, но я не могу понять почему они не пересекаются"
18 Steel_Wheel
 
28.01.12
10:44
(5) Чтобы можно было создать экземпляр класса.... хоть бы и пустой
19 Steel_Wheel
 
28.01.12
10:45
(14) Самый логичный язык, кмк... Ну, Ява еще. В ней код особенно элегантно выглядит
20 Rie
 
28.01.12
10:52
(19) Логичный. Один из наиболее точно и строго определённых языков (а среди промышленных языков - как бы не самый). Но проблема в том, что эту логику надо знать. Ну и эта логика (впрочем, как и любая другая) - не слишком наглядна (на любом форуме по C++ полно вопросов "а как эта хрень должна работать?", ответ на которые всегда находится и обосновывается - но не всегда очевиден).
21 Ненавижу 1С
 
гуру
28.01.12
10:58
фигня, Си уже страдал фигней, а в плюсах вместо полировки качества языка - фигни только добавили и стало просто жёпа
вот такой он Си++ неудобный, но в свое время был наилучшим, всему свое время есть, приходит и уходит
22 zak555
 
28.01.12
11:00
(21) что неудобного ?
23 Рэйв
 
28.01.12
11:01
(0)тебе объяснить слово "по умолчанию"? или объяснить почему совсем без конструктора нельзя?
24 Xapac
 
28.01.12
11:06
(21)??
25 Rie
 
28.01.12
11:06
(23)
"Верблюда спросили:
- Почему у тебя спина кривая?
- А что у меня прямое? - ответил верблюд"
26 Mikeware
 
28.01.12
11:09
(25)"смотри, как они лошадку изуродовали!!!"©
27 Рэйв
 
28.01.12
11:09
(25)Вот именно.
Положено так по сценарию.
:-)
28 Rie
 
28.01.12
11:10
(24) Если не утрировать - то действительно имеет место быть набор неудобств. Как следствие сложности самих языковых механизмов. Столь гибкое множественное наследие вкупе с управлением областями видимости нечасто встретишь, а если на это накладывается мощь C++ных шаблонов (которые, вообще говоря, как бы не Тьюринг-полные) - то начинается сплошное веселье.
29 Рэйв
 
28.01.12
11:11
(28)Всегда ненавидел разбирать эти библиотеки..Там как в вики - начнешь искать отчество Ленина, очнешься  что читаешь про овечку Долли....
30 Rie
 
28.01.12
11:11
+(28) Да и хотя бы те же конструкторы - они ведь в C++ отличаются от всех прочих (Java, Delphi, C# и т.д.).
31 Рэйв
 
28.01.12
11:12
(30)В шарпе вроде также все.
32 Rie
 
28.01.12
11:12
(29) "Кормил ребёнка. Положил соску на горячую плиту. Она прилипла. Набрал в поисковике "Как отодрать соску"..." (c) молодой, но уже бородатый анекдот
33 Рэйв
 
28.01.12
11:12
синтаксис может чуть другой
34 PushoN
 
28.01.12
11:13
(0) ты когда родился у родителей не спросил почему у тебя 5 пальце на одной руке а не 4 ?
35 PushoN
 
28.01.12
11:15
(21) чушь несешь!
36 Rie
 
28.01.12
11:16
(31) Не совсем. Конструктор в C++ работает с ещё не до конца созданным объектом - отсюда и некоторые ограничения. В новом стандарте это вроде бы подправили. Но (как обычно:-) сохранив "тонкую логику".
37 PushoN
 
28.01.12
11:16
(0) вообще иди читай что такое есть конструктор в ООП.
38 Rie
 
28.01.12
11:26
(37) А чем ему это поможет?
(Честно говоря, я так и не понял, что именно хотел узнать ТС).
39 Рэйв
 
28.01.12
11:27
(38)Да  его жаба давит от пустой процедуры которая ничего не делает, но без которой ниче не работает:-)
40 Rie
 
28.01.12
11:31
(39) Он не понимает, что она - НЕ пустая (в общем случае). И НЕ функция :-)
(Насчёт последнего - поэтому ему и мало поможет общее понятие конструктора, поскольку в разных языках конструктор трактуется по разному).
41 Рэйв
 
28.01.12
12:11
(40)В плюсах еси што вообще нет функций:-)..Есть void, есть не void
42 Рэйв
 
28.01.12
12:13
+(41)Вернее нет процедур, да:-)..
43 ДенисЧ
 
28.01.12
12:17
Вброс: с++ не нужен, если есть хаскель и немерле...
44 Steel_Wheel
 
28.01.12
12:46
(21) Я что-то пропустил... А когда С++ успел так сильно поменяться?
45 Steel_Wheel
 
28.01.12
12:49
(36) В смысле "не до конца"? Кажется, память уже выделена под типы, которые ты заявил в качестве переменных-членов класса. Т.е. с ними уже можно работать
46 Rie
 
28.01.12
12:54
(41) Есть конструкторы :-) Они в C++ - не функции (ну или не совсем функции) :-)
47 Torquader
 
28.01.12
14:29
Не забывайте, что обязательно должен быть конструктор копирования (то есть функция, создающая один объект на основе другого такого же) - его компилятор создаёт автоматически, также как создаётся функция копирования для любых структур.
Только это всё делается на этапах компиляции - в итоговом коде, если конструктор пустой, ничего вообще не появится.
48 Rie
 
28.01.12
14:50
Тут главная фишка не в том, что конструкторы создаются автоматически, а в том, что их можно переопределить - и получить от этого бонус (или по лбу - если глупо переопределить).
49 Ненавижу 1С
 
гуру
28.01.12
18:51
си++ очень мощен, спору нет, но... (21) никто не отменял!
50 DGorgoN
 
28.01.12
19:04
Конструктор нужен всяко по стандартам языка для создания обьекта. Если конструктора нет - то и нет объекта.
51 SUA
 
01.02.12
10:53
(20)
известная "точность" - что будет в переменной после вычисления
int i=5;i=++i + ++i;
52 toypaul
 
гуру
01.02.12
11:04
делает он это, чтобы инициализировать переменные объекта. например, переменные объекты.
53 Sk0rp
 
01.02.12
11:13
(0) Объективных причин нет и это скорее всего компиляторозависимая фича.
(6) Такое на этапе компиляции прекрасно разруливается, можно сделать конструктор private и компилятор сам расскажет про все неявные места его вызова или попытки взять адрес.
54 Sk0rp
 
01.02.12
11:21
+(53) Конечно, если в теле есть объекты у которых есть свои конструкторы, то тогда надо сформировать код, который их в правильном порядке вызовет. Тогда генерация конструктора необходима и неизбежна.
Более того компилятор вставит этот код даже в созданный явно конструктор. Переопределить это поведение можно записав вызов конструкторов через двоеточие после декларации конструктора,но до его тела (до открывающей фигурной скобки)
55 Sk0rp
 
01.02.12
11:23
(44) C++0x посмотри, там кусок boost'а внесен в стандарт, введены автоматические типы переменных и еще куча всего.