|
Зачем нужен пустой конструктор по-умолчанию 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'а внесен в стандарт, введены автоматические типы переменных и еще куча всего.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |