2012-01-05 3 views
3

Сегодня мой друг спросил меня: зачем нам нужны конструкторы на C++? Где мы можем сделать то же самое на структурном языке. Что такое специальность конструкторов, показать мне необходимость конструкторов, чтобы я использовал его в своей программе на C++. Пожалуйста, помогите мне и приведи несколько примеров, чтобы я смог уяснить его сомнения.Почему нам нужны конструкторы?

+8

Почему люди используют подрядчиков для строительства домов для них? ... потому что это проще, чем делать это самостоятельно. –

+0

Вы можете предложить вашему другу попробовать написать все в сборке. – Cascabel

+0

@Marc B, вы утверждаете, что конструкторы по умолчанию выделяют память для всех переменных-членов данных внутри класса во время создания объекта ?? что содержит тело конструкторов по умолчанию? Является ли компилятор внедрить какой-либо скрытый код в определяемые пользователем конструкторы? Если да, как это выглядит? Пожалуйста, объясни. – sree

ответ

10

Вы не делаете нужде конструкторов в том же смысле, что дон 't необходимо большинство особенностей популярных языков.

Конструкторы существуют, чтобы сделать его более сложным. The Wrong Thing. В этом случае используйте данные, которые не были инициализированы.

+1

Согласовано. Хотя на протяжении десятилетий он добавил свои собственные полноценные функции, стоит вспомнить, что C++ начал свою жизнь как препроцессор до C. Конструкторы - это функция init, как и любая хорошая функция init, которую вы пишете на C, но у них есть первая класс, поэтому для пользователей есть еще одна минута, и, следовательно, больше безопасности, чем использование еще двухэтапного шаблона инициализации. Это та же самая причина, по которой C++ работает над тем, чтобы создаваемые пользователем типы велись так же, как и встроенные типы. Чем меньше несоответствий, тем легче учиться и использовать. – matthias

+0

@Drew Dormann, что вы подразумеваете под словом «The Wrong Thing»? Пожалуйста, объясни. – sree

+0

@sree в этом случае, «The Wrong Thing» относится к использованию данных, которые не были инициализированы. –

0

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

В .net можно обойти Конструктор (с привилегированным кодом), и вы получите объекты, поля инициализируются в 0.

0

Это как раз то, как работают объектно-ориентированные языки. В C вы должны использовать malloc для выделения памяти и затем инициализировать эту память в некотором роде. В C++ конструктор выполняет обе вещи. Объединив эти две вещи, это затрудняет разработчику выделение памяти и отказ/забыть ее инициализировать.

0

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

0

Неизменяемые объекты.

Когда вы работаете с параллельным или параллельным программированием, гораздо проще обмениваться объектами, которые нельзя изменить. Вам не нужно беспокоиться о гоночных условиях, замках и т. Д. Но единственный способ создать неизменяемый объект на большинстве языков ООП - через конструктор. Вы не можете устанавливать свойства объекта, потому что по определению все свойства доступны только для чтения.

+0

Но если ваш объект неизменен, почему он вообще является объектом? (Этот вопрос касается C++.) – reinierpost

+0

Возможно, вам по-прежнему нужна функциональность, и эта функциональность может быть полиморфной. Например, в WinRT есть интерфейсы списка только для чтения, которые вы можете реализовать на C++. –

3

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

Хорошим практическим примером того, почему конструкторы полезны, является мысль о шаблоне RAII. Имея конструктор, вы инкапсулируете очень красиво как инициализацию, так и приобретение в том же месте, где у вас есть разрушение. C, который не имеет конструкторов, известен тем, что программисты забывают о шаге в этом процессе.

3

Как уже говорили другие люди, вы используете конструктор так же, как вы используете функцию init на языке процедур, но благодаря конструкторам нет возможности программиста забыть вызвать функцию init - компилятор делает это для него. Еще одно преимущество, которое дает это, помимо того, что оно автоматически вызвало его, изящно разрешает проблему инициализации : в случае класса A, который расширяет класс B, который расширяет класс C, гарантируется, что все три конструктора (для класса A, B и C) и что они будут вызваны в правильном порядке (класс C, затем класс B, затем класс A), чтобы каждый конструктор уже мог использовать все данные из суперкласса (поскольку он уже был инициализируется).В случае языка без конструкторов программисту нужно будет заботиться обо всех этих бухгалтериях.