powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / "Если в классе не объявлены конструкторы, то...
25 сообщений из 51, страница 1 из 3
"Если в классе не объявлены конструкторы, то...
    #37854240
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...компилятор сам создаст конструктор по умолчанию"

Интересует мнение форумчан, насколько эта каноническая фраза вообще корректна?

Преподавая ООП, я вижу, что она сбивает с толку студентов, и считаю, что она не только не соответствует физической действительности, но и чисто с точки зрения обучения вредна, вызывает такие ассоциации, мол, можно не писать конструктор, компилятор его сам создаст..

Итак,
1. Если в классе объявлены конструкторы (хотя бы один), то это предписывает способы создания объекта. Нет среди них дефолтного конструктора - создавать объекты без параметров нельзя. Это логично, что объявлением конструкторов мы описываем как можно и как нельзя создавать объекты.
2. Если в классе нет ни одного конструктора, то его объекты можно создавать - и это правильно, в С++ нет обязательных методов, класс может быть вообще пустым (иногда это полезно).

Но ПОЧЕМУ п.2 приравнивается к "будет создан конструктор по умолчанию"? В чем проявляется его "созданность"? Фактически, в этом случае у класса просто нет конструктора, но его объекты можно создавать - просто не срабатывает никакой конструктор. Никто поля не проинициализирует за программиста.

Кто-то может предположить, что работает единый механизм: компилятор создает функцию, на которую идет переход при каждом создании объекта. Если в классе нет конструкторов, то функция все равно создается и вызывается, только она пустая. Да, это действительно было бы "компилятор создает конструктор". Но это не так! Если в классе нет конструктора, то при создании объекта ничего не вызывается, нет никакого мифического "конструктора, созданного компилятором".

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Foo1
{
public:
	Foo1(){}
};

class Foo2
{
};

void main()
{
	Foo1 f1;
	Foo2 f2;
}



И вуаля:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
void main()
{
00D915B0  push        ebp  
00D915B1  mov         ebp,esp  
00D915B3  sub         esp,0D8h  
00D915B9  push        ebx  
00D915BA  push        esi  
00D915BB  push        edi  
00D915BC  lea         edi,[ebp-0D8h]  
00D915C2  mov         ecx,36h  
00D915C7  mov         eax,0CCCCCCCCh  
00D915CC  rep stos    dword ptr es:[edi]  
	Foo1 f1;
00D915CE  lea         ecx,[f1]  
00D915D1  call        Foo1::Foo1 (0D911AEh)  // Для f1 реально вызывается конструктор, хотя в Release может не будет и этого 
	Foo2 f2;       // А здесь даже при отключенной оптимизации НЕ ВЫЗЫВАЕТСЯ НИЧЕГО, покуда вызывать просто нечего.
}
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854382
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю ни в одном языке стандарт не имеет такой авторитет и не является настолько ревностно защищаемым и продуманным как в С++. И употребленное вами слово "канонический" в своем изначальном значении здесь очень точно.

Так говорит стандарт: "Если нет объявленного пользователем конструктора по умолчанию, будет неявно объявлен конструктор без параметров, и он будет описан как "функция-член по умолчанию (std - defaulted member-function)". В некоторых случаях неявно объявленный конструктор может быть помечен как удаленный (то есть конструктора без параметров фактически нет, и им нельзя никоим образом воспользоваться), все эти случаи так же рассмотрены стандартом. То есть "запрещение" конструктора без параметров тоже делается через механизм неявного объявления конструктора без параметров. То есть не все так просто с этим механизмом как у вас представлено.

Что касается доводов относительно его "тривиальности (std)". В указанном вами случае конструктор тривиален, и этот случай подходит под те пункты стандарта которые описывают в каких ситуациях неявно объявленный конструктор по умолчанию без параметров будет тривиальным. Нужно понимать что приведи вы хоть тысячу примеров, это не даст вам возможности твердо перейти к закономерности. А у вас единичный пример. В стандарте указано точно - в остальных случаях данный конструктор будет не тривиальным.

Конструктор бппу тривиален при соблюдении всех следующих условий одновременно:

Класс не имеет виртуальных функций и виртуальных базовых классов, все родители класса имеют тривиальные конструкторы, для всех членов класса которые сами являются классами существуют тривиальные конструкторы по умолчанию. Иначе конструктор бппу не тривиален.

Например:

Код: plaintext
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.
class simple
{
	public:
		simple(){}
};

class nottrivial
{
	public:
		nottrivial()
		{
		}
};

class trivial
{
	nottrivial m_nt;
};

int main()
{
	simple s;
	trivial t;

	return 0;
}


Код: sql
1.
2.
3.
4.
	call	_ZN6simpleC1Ev
	leaq	-2(%rbp), %rax
	movq	%rax, %rdi
	call	_ZN7trivialC1Ev
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854406
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть я не до конца понял Вашу мысль, особенно про тривиальность класса (при чем тут она). как именно это:

sherzod_Так говорит стандарт: "Если нет объявленного пользователем конструктора по умолчанию, будет неявно объявлен конструктор без параметров, и он будет описан как "функция-член по умолчанию (std - defaulted member-function)".
фактически проявлено? Если в пустом классе конструктор объявлен компилятором (хоть и неявно), это говорит о том, что он СУЩЕСТВУЕТ. Каким способом можно убедиться в этом?
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854417
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceМожет быть я не до конца понял Вашу мысль, особенно про тривиальность класса (при чем тут она). как именно это:

sherzod_Так говорит стандарт: "Если нет объявленного пользователем конструктора по умолчанию, будет неявно объявлен конструктор без параметров, и он будет описан как "функция-член по умолчанию (std - defaulted member-function)".
фактически проявлено? Если в пустом классе конструктор объявлен компилятором (хоть и неявно), это говорит о том, что он СУЩЕСТВУЕТ. Каким способом можно убедиться в этом? Почему вы привели отрывок? Дальше ведь идут уточнения о том что этот конструктор может стать тривиальным, а может быть и удален. Чтобы убедиться что конструктор создан просмотрите ассемблерный код приведенного мной примера.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854438
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sherzod_,

хм.. спасибо, покопаю ассемблер, т.е. все-таки для trivial будет создан конструктор, вызывающий конструкторы полей.

Хотя стоп, я бы все-таки не назвал это конструктором класса trivial по умолчанию. Конструкторы предков и полей вызываются автоматически В ЛЮБОМ конструкторе класса, явно объявленном, это просто механизм, который гарантирует, что при создании объекта отработают явно заданные конструкторы предков и полей. Но какое это имеет отношение к конструктору непосредственно самого класса trivial?
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854461
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 07:54 AM, TopSpace wrote:
> Автор: TopSpace. ...компилятор сам создаст конструктор по умолчанию"

> Интересует мнение форумчан, насколько эта каноническая фраза вообще корректна?

Некорректна.

Конструкторов два, умолчательный и копирования. Они каждый создаются
или нет компилятором по своим правилам.

> Преподавая ООП, я вижу, что она сбивает с толку студентов, и считаю, что она не
> только не соответствует физической действительности, но и чисто с точки зрения
> обучения вредна, вызывает такие ассоциации, мол, можно не писать конструктор,
> компилятор его сам создаст..

Конечно неверная.


> Но ПОЧЕМУ п.2 приравнивается к "будет создан конструктор по умолчанию"? В чем
> проявляется его "созданность"?

Блин, в том, что он будет создан.
Будет существовать такая функция, её можно будет ЯВНО вызывать, даже она может
иметь адрес, и всегда имеет вполне конкретный код. А именно -- вызов всех
конструкторов виртуальных баз в порядке объявления в списке наследования, вызов
всех конструкторов невиртуальных баз в порядке объявления в списке наследования,
затем вызов всех конструкторов членов класса в порядке объявления
в классе. Ну и ещё инициализируется указатель на таблицу виртуальных методов,
если такая есть.

Фактически, в этом случае у класса просто нет
> конструктора, но его объекты можно создавать - просто не срабатывает никакой
> конструктор. Никто поля не проинициализирует за программиста.

Проинициализирует. Кстати это принципиально.

> Кто-то может предположить, что работает единый механизм: компилятор создает
> функцию, на которую идет переход при каждом создании объекта.

Так именно и происходит.

Если в классе нет
> конструкторов, то функция все равно создается и вызывается, только она пустая.

Она не пустая.

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

Это абсолютно неверно. Это верно только для так называемых POD-структур.
Это классы, не имеющие ни одного предка или мембера нуждающихся в
конструировании. и не имеющие виртуальные методы.


> 00D915CE lea ecx,[f1]
> 00D915D1 call Foo1::Foo1 (0D911AEh)// Для f1 реально вызывается конструктор, хотя в Release может не будет и этого
> \tFoo2 f2;// А здесь даже при отключенной оптимизации НЕ ВЫЗЫВАЕТСЯ НИЧЕГО, покуда вызывать просто нечего.

Потому что твой класс -- это POD-структура.



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854463
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 07:54 AM, TopSpace wrote:

> Преподавая ООП, я вижу, что она сбивает с толку студентов, и считаю, что она не
> только не соответствует физической действительности, но и чисто с точки зрения
> обучения вредна, вызывает такие ассоциации, мол, можно не писать конструктор,
> компилятор его сам создаст..

Если ты реально преподаёш ООП, в частности, С++, то я тебе настойчиво рекомендую
прочитать стандарт языка. Это трудно и муторно, но всё же надо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854472
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 10:53 AM, sherzod_ wrote:

> Так говорит стандарт: "Если нет объявленного пользователем конструктора по
> умолчанию,

Не хочется сейчас копать стандарт, но условие другое -- если ВООБЩЕ НИ ОДНОГО
конструктора явно не объявлено.

будет неявно объявлен конструктор без параметров, и он будет описан
> как "функция-член по умолчанию (std - defaulted member-function)".

Ну и не только объявлен, но и определён.


> Класс не имеет виртуальных функций и виртуальных базовых классов, все родители
> класса имеют тривиальные конструкторы, для всех членов класса которые сами
> являются классами существуют тривиальные конструкторы по умолчанию. Иначе
> конструктор бппу не тривиален.

Блин, таки придётся лезть в стандарт...

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854479
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 11:24 AM, TopSpace wrote:

> хм.. спасибо, покопаю ассемблер, т.е. все-таки для trivial будет создан
> конструктор, вызывающий конструкторы полей.

Стандарт надо копать, а не ассемблер.



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854498
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivПроинициализирует. Кстати это принципиально.

ээ.. в смысле?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Foo
{
	int x;
};

int main()
{
	Foo f;  // в f.x лежит мусор

	return 0;
}
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854536
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 11:58 AM, TopSpace wrote:

> Проинициализирует. Кстати это принципиально.

> ээ.. в смысле?
>
>
> class Foo
> {
> int x;
> };
>
> int main()
> {
> Foo f;// в f.x лежит мусор

У f.x нет конструктора, был бы -- проинициализировался бы и f.x

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854653
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

я кажется понял причины своего вопроса)

В моем понимании, конструктор - это тот метод, который обеспечивает инициализацию всех полей объекта. Он и называется соответствующе: его задача привести объект к "рабочему" состоянию, чтобы в нем не осталось не инициализированных полей. Это я про концептуальное понимание говорю, не про стандарт языка.

Вот в этом смысле компилятор не "создает конструктор по умолчанию". То, о чем говорилось в постах выше - это механизм автоматического вызова конструкторов базовых классов и полей объекта. Тем более, что

У f.x нет конструктора, был бы -- проинициализировался бы и f.x

- не совсем так. Почему
Код: plaintext
1.
Foo* f = new Foo();    или    Foo f = Foo();   


- это вызов конструктора по умолчанию, а

Код: plaintext
1.
int x = int(); 


- нет? Та же семантика, тот же смысл операции, int() вернет ноль, поэтому было бы логично, чтобы в f.z тоже записался бы ноль (как делается в C#). Вот тогда это был бы действительно "конструктор создается компилятором", и его реально можно не писать, возлагая эту задачу на компилятор.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854690
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceПочему
Код: plaintext
1.
Foo* f = new Foo();    или    Foo f = Foo();   


- это вызов конструктора по умолчанию, а

Код: plaintext
1.
int x = int(); 


- нет?Потому что int (в C++) не есть класс.
(Для сравнения, в C# int есть класс, и там правила для int и Foo во многом будут единообразны.)
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854721
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,

справедливо. И не поспоришь ни с чем, с одной стороны. С другой, не покидает меня это ощущение, что "конструктор создаваемый компилятором" не совсем конструктор, ибо простые поля объекта он не трогает, а фраза подобная усыпляет бдительность неофитов (мол, можно ничего не писать - сами поля занулятся).
Видимо, причина подобных казусов в том, что С++ - это "переходный" язык, от процедурного к ООП, т.к. в нем еще не соблюдается (как в C# и Java) правило "все есть класс".
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854765
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 01:10 PM, TopSpace wrote:

> В моем понимании, конструктор - это тот метод, который обеспечивает
> инициализацию всех полей объекта. Он и называется соответствующе: его задача
> привести объект к "рабочему" состоянию, чтобы в нем не осталось не
> инициализированных полей. Это я про концептуальное понимание говорю, не про
> стандарт языка.

Зачем нам какое-то другое понимание что такое конструктор, вместо стандартного ?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854773
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 01:30 PM, TopSpace wrote:

> справедливо. И не поспоришь ни с чем, с одной стороны. С другой, не покидает
> меня это ощущение, что "конструктор создаваемый компилятором" не совсем
> конструктор, ибо простые поля объекта он не трогает, а фраза подобная усыпляет
> бдительность неофитов (мол, можно ничего не писать - сами поля занулятся).
> Видимо, причина подобных казусов в том, что С++ - это "переходный" язык, от
> процедурного к ООП, т.к. в нем еще не соблюдается (как в C# и Java) правило "все
> есть класс".

Бред полный. "Не совсем конструктор" и "переходный язык" -- особенно.

В Java тоже не "всё есть класс". За что он неоднократно критиковался.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854787
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

вам стандарт дороже элементарной логики?

1. Конструктор - это метод, который предназначен для инициализации полей объекта (в т.ч. простых, для int - нули)/
2. Если нет конструкторов, компилятор сам создаст конструктор по умолчанию.

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

3. Значит я могу объявить класс без единого конструктора, и его поля (в т.ч. простые) будут проинициализированы.

А это не так. Почему - уже разобрались. В C# это так, отсюда я и сказал про "переходность".
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854890
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 06/26/2012 02:00 PM, TopSpace wrote:

> вам стандарт дороже элементарной логики?

нет, логика и прописана в стандарте.

> 1. Конструктор - это метод, который предназначен для инициализации полей объекта
> (в т.ч. простых, для int - нули)/

Нет, конструктор -- это метод, предназначенный для инициализации объекта класса.
У класса вообще может не быть полей, но инициализация должна произойти.


> 3. Значит я могу объявить класс без единого конструктора, и его поля (в т.ч.
> простые) будут проинициализированы.

Не будут в общем случае.

>
> А это не так. Почему - уже разобрались. В C# это так, отсюда я и сказал про
> "переходность".

Ну, С# -то тут при чём ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37854948
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

C# при том, что по сравнению с С++ он более полно воплощает концепцию ООП. Т.е. это практически чистый ООП-язык, а С++ одной ногой в процедурном подходе С, другой - в мире ООП.
Отсюда и такие несуразности. Я не объявил конструкторы, компилятор создаст к-р по умолчанию сам, ожидаемо (исходя из самой концепции конструктора!), что он проведет какую-то инициализацию. Да, вызовет к-ры предков и полей - но почему не всех? Почему он оставит не проинициализированными поля простого типа, не смотря на то, что компилятор, вообще-то, "знает" какие у них значения по умолчанию (int() вернет 0, double() вернет 0.0)?
В C# это работает именно так: не объявил конструкторы? Да пожалуйста, мусора в полях объекта гарантированно все равно не останется, т.е. реально отрабатывает код, заносящий нули не только в поля этого объекта. Вот это я понимаю "компилятор создал конструктор по умолчанию автоматически", соответствие задаче 100%. А в С++ половину проинициализирует, половину нет (простые типы). Я уже не раз видел, как студенты трактуют эту каноническую фразу как необязательность конструктора, и как следствие - они получают мусор в простых полях.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37855003
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceMasterZiv,
C# при том, что по сравнению с С++ он более полно воплощает концепцию ООП. Т.е. это практически чистый ООП-язык, а С++ одной ногой в процедурном подходе С, другой - в мире ООП.
Отсюда и такие несуразности. Я не объявил конструкторы, компилятор создаст к-р по умолчанию сам, ожидаемо (исходя из самой концепции конструктора!), что он проведет какую-то инициализацию. Да, вызовет к-ры предков и полей - но почему не всех? Почему он оставит не проинициализированными поля простого типа, не смотря на то, что компилятор, вообще-то, "знает" какие у них значения по умолчанию (int() вернет 0, double() вернет 0.0)?
В C# это работает именно так: не объявил конструкторы? Да пожалуйста, мусора в полях объекта гарантированно все равно не останется, т.е. реально отрабатывает код, заносящий нули не только в поля этого объекта. Вот это я понимаю "компилятор создал конструктор по умолчанию автоматически", соответствие задаче 100%. А в С++ половину проинициализирует, половину нет (простые типы). Я уже не раз видел, как студенты трактуют эту каноническую фразу как необязательность конструктора, и как следствие - они получают мусор в простых полях.Бросьте плюсы, займитесь C#. Все станет гораздо проще. Если вы на таком уровне понимания, и с таким нежеланием признать ошибки в толковании с вольным додумыванием, еще и критикуете язык (самый верный способ перестать понимать предмет еще больше), то что ожидать от студентов-то.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37855031
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceДа, вызовет к-ры предков и полей - но почему не всех? Почему он оставит не проинициализированными поля простого типа, не смотря на то, что компилятор, вообще-то, "знает" какие у них значения по умолчанию (int() вернет 0, double() вернет 0.0)?
Это сделано для совместимости со структурами С.
А в С это нужно, потому что это язык низкого уровня, и если программисту потребуется инициализация, то он укажет ее явно, а иначе не зачем тратить ресурсы на ее проведение.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37855049
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sherzod_,

для каждой задачи свой инструмент, я вышел из возраста "какой язык лучше".

Какая критика? Я отметил, что C# более объектно-ориентирован, чем С++ - Вы с этим не согласны?

Додумывания нет, я просто смотрю на вопрос с дидактической точки зрения, и вижу, что эта фраза больше путает, чем поясняет. Ведь это не я ее пишу - ко мне приходят студенты с ошибками, прочитав ее в одной из книг (где она встречается повсеместно, и часто без пояснений подробностей).

Вы думаете я не понимаю, что без конструктора простые поля сами не проинициализируются? Тут вопрос принципа, хочется видеть правильные формулировки. Элементарную логическую цепочку из 3 шагов я привел выше - оспорьте, если желаете.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37855065
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpacesherzod_,

для каждой задачи свой инструмент, я вышел из возраста "какой язык лучше".

Какая критика? Я отметил, что C# более объектно-ориентирован, чем С++ - Вы с этим не согласны?

Додумывания нет, я просто смотрю на вопрос с дидактической точки зрения, и вижу, что эта фраза больше путает, чем поясняет. Ведь это не я ее пишу - ко мне приходят студенты с ошибками, прочитав ее в одной из книг (где она встречается повсеместно, и часто без пояснений подробностей).

Вы думаете я не понимаю, что без конструктора простые поля сами не проинициализируются? Тут вопрос принципа, хочется видеть правильные формулировки. Элементарную логическую цепочку из 3 шагов я привел выше - оспорьте, если желаете.В вашей логической цепочке 1, 3 утверждения не верные, вам же сказали уже.
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37855087
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> C# при том, что по сравнению с С++ он более полно воплощает концепцию ООП. Т.е.
> это практически чистый ООП-язык, а С++ одной ногой в процедурном подходе С,
> другой - в мире ООП.

Всё, дальше можешь не продолжать этот бред.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
"Если в классе не объявлены конструкторы, то...
    #37855089
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

да, логично.

Посмотрел кстати здесь: конструктор по умолчанию .

В C++ и Java если нет явным образом опредёленных конструкторов в классе, то компилятор использует конструктор по умолчанию, опредёленный неявным способом, который аналогичен «чистому» конструктору по умолчанию.

Казалось бы мелочь, но смысл уже немного другой. Компилятор создает "чистый" конструктор по умолчанию - вот это точное определение.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / "Если в классе не объявлены конструкторы, то...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]