Для чего используется ключевое слово new

new оператор (C++)

Пытается выделить и инициализировать объект или массив объектов указанного или типа заполнителя и возвращает подходящим образом типизированный указатель на объект (или на исходный объект массива).

Синтаксис

new-expression :
:: :: new new-placement new new-type-id new-initializer new-placement
:: :: new new-placement new ( type-id ) new-initializer new-placement

new-placement :
( expression-list )

new-type-id :
type-specifier-seq new-declarator type-specifier-seq

new-declarator :
ptr-operator new-declarator ptr-operator
noptr-new-declarator

noptr-new-declarator :
[ expression ] attribute-specifier-seq [
noptr-new-declarator [ constant-expression ] attribute-specifier-seq noptr-new-declarator

new-initializer :
( expression-list ( )
braced-init-list

Комментарии

В случае неудачи new возвращает ноль или вызывает исключение. Дополнительные сведения см. в разделе delete операторы и. Это поведение по умолчанию можно изменить, написав настраиваемую подпрограммы обработки исключений и вызвав _set_new_handler функцию библиотеки времени выполнения с именем функции в качестве аргумента.

Сведения о том, как создать объект в управляемой куче в C++/CLI и C++/CX, см. в разделе gcnew.

Если new используется для выделения памяти для объекта класса C++, конструктор объекта вызывается после выделения памяти.

Используйте delete оператор, чтобы освободить память, выделенную new оператором. Оператор используется delete[] для удаления массива, выделенного new оператором.

В следующем примере выделяется и затем освобождается двумерный массив символов размером dim на 10. При выделении многомерного массива все измерения, за исключением первого, должны быть константными выражениями, результатом вычисления которых являются положительные значения. Крайнее левое измерение массива может быть любым выражением, результатом вычисления которого является положительное значение. При выделении массива с помощью new оператора первое измерение может равняться нулю; new оператор возвращает уникальный указатель.

Объект type-id не может const содержать volatile объявления,, объявления классов и перечисления. Следующее выражение имеет неправильный формат:

new Оператор не выделяет ссылочные типы, так как они не являются объектами.

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

Если вы используете оператор new без каких бы то ни было дополнительных аргументов и компилируете с /GX /EHa /EHs параметром, или, компилятор создает код для вызова оператора, delete Если конструктор создает исключение.

В следующем списке описаны элементы грамматики new :

type-id
Указывает тип для выделения; Это может быть либо встроенный, либо определяемый пользователем тип. Если спецификация типа является сложной, она может быть окружена круглыми скобками, чтобы принудительно реализовать порядок привязки. Тип может быть заполнителем ( auto ), тип которого определяется компилятором.

new-initializer
Предоставляет значение для инициализированного объекта. Инициализаторы не могут быть указаны для массивов. new Оператор создает массивы объектов, только если у класса есть конструктор по умолчанию.

Пример: выделение и освобождение массива символов

Пример: new оператор

Если используется форма размещения new оператора (форма с дополнительными аргументами, чем размер), компилятор не поддерживает форму размещения delete оператора, если конструктор создает исключение. Пример:

Инициализация объектов, выделенных с помощью new

Необязательное new-initializer поле включено в грамматику для new оператора. Это поле позволяет инициализировать новые объекты с помощью пользовательских конструкторов. Дополнительные сведения о том, как выполняется инициализация, см. в разделе инициализаторы. В следующем примере показано, как использовать выражение инициализации с new оператором:

Если объект имеет тип класса и этот класс имеет конструкторы (как в предыдущем примере), объект может инициализироваться new оператором только в том случае, если выполняется одно из следующих условий:

Аргументы, указанные в инициализаторе, соответствуют аргументам конструктора.

Класс имеет конструктор по умолчанию (конструктор, который можно вызвать без аргументов).

Явная инициализация каждого элемента не может быть выполнена при выделении массивов с помощью new оператора; вызывается только конструктор по умолчанию, если он имеется. Дополнительные сведения см. в разделе аргументы по умолчанию.

Если выделение памяти завершается ошибкой ( operator new возвращает значение 0), инициализация не выполняется. Такое поведение защищает от попыток инициализировать несуществующие данные.

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

Время существования объектов, выделенных с помощью new

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

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

Как работает new

new-expression (Выражение, содержащее new оператор) выполняет три вещи:

Находит и резервирует хранилище для объекта или объектов, которым нужно выделить память. После завершения этого этапа выделяется правильный объем хранилища, но еще не объект.

Инициализирует объекты. После завершения инициализации имеется достаточно информации, чтобы выделенная память являлась объектом.

Исходная цель new-placement поля — разрешить выделение аппаратно зависимых объектов по указанным пользователем адресам.

Хотя в предыдущем примере показан только один аргумент в new-placement поле, не существует ограничений на количество дополнительных аргументов, которые могут быть переданы operator new таким образом.

Оператор разрешения области действия ( :: ) принудительно использует глобальный new оператор.

Источник

Оператор new (справочник по C#)

Оператор new создает экземпляр типа.

Вызов конструктора

Для создания экземпляра типа обычно вызывается один из конструкторов этого типа с помощью оператора new :

Начиная с версии C# 9.0 выражения вызова конструктора имеют целевой тип. То есть, если известен целевой тип выражения, вы можете опустить имя типа, как показано в следующем примере:

Как показано в предыдущем примере, выражение new с целевым типом всегда указывается в скобках.

Если целевой тип выражения new неизвестен (например, если вы используете ключевое слово var ), нужно указать имя типа.

создание массива

С помощью оператора new можно также создать экземпляр массива, как показано в следующем примере:

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

Дополнительные сведения см. в руководстве по работе с массивами.

Создание экземпляров анонимных типов

Чтобы создать экземпляр анонимного типа, используйте оператор new и синтаксис инициализации объекта:

Уничтожение экземпляров типа

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

Для экземпляров типа, которые содержат неуправляемые ресурсы, например дескриптор файла, рекомендуется использовать детерминированную очистку, чтобы как можно скорее высвободить эти ресурсы. Дополнительные сведения см. в справке по API System.IDisposable и статье об операторе using.

Возможность перегрузки оператора

Спецификация языка C#

Дополнительные сведения см. в разделе Оператор newспецификация языка C#.

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

Источник

Что такое ключевое слово » new » в JavaScript?

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

14 ответов:

Примечание: функции-конструктора ссылается на функцию после new ключевое слово, как в

как только это будет сделано, если запрашивается неопределенное свойство нового объекта, скрипт проверит объект [[прототип]] объект для свойства вместо этого. Вот как вы можете получить что-то похожее на традиционное наследование классов в JavaScript.

самая трудная часть об этом-пункт № 2. Каждый объект (включая функции) имеет это внутреннее свойство под названием [[прототип]]. Он может только быть установлен во время создания объекта, либо с новая С

Предположим, у вас есть эта функция:

если вы вызываете это как автономную функцию, например:

выполнение этой функции добавит два свойства к

В дополнение к ответу Даниэля Говарда, вот что new делает (или по крайней мере кажется):

для начинающих, чтобы понять его лучше

попробуйте следующий код в консоли браузера.

Теперь вы можете прочитать ответ сообщества wiki:)

так что это, вероятно, не для создания экземпляры объекта

Он используется именно для этого. Вы определяете конструктор функции следующим образом:

все объекты, созданные из этого конструктора теперь будет getName из-за прототипа цепи, к которой они имеют доступ.

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

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

классы не нужны для объектов-Javascript-это прототип на основе язык.

для меня, пока я не прототип, я использую стиль func2, поскольку он дает мне немного больше гибкости внутри и снаружи функции.

The new ключевое слово для создания новых экземпляров объекта. И да, javascript-это динамический язык программирования, который поддерживает парадигму объектно-ориентированного программирования. Соглашение об именовании объектов, всегда использовать заглавную букву для объектов, которые должны быть созданы с помощью нового ключевого слова.

есть уже некоторые очень большие ответы, но я публикую новый, чтобы подчеркнуть мое наблюдение на случай III ниже о том, что происходит, когда у вас есть явный оператор return в функции которого new ing вверх. Посмотрите на следующие случаи:

Дело I:

дело II:

дело III:

вещь, чтобы отметить в случае III объект создается из-за new ключевое слово потерялось с Вашего радара. bar фактически указывает на совершенно другой объект, который не является тем, который JavaScript интерпретатор создан за счет new ключевое слово.

Ну JavaScript на si может сильно отличаться от платформы к платформе, поскольку это всегда реализация исходной спецификации EcmaScript.

в любом случае, независимо от реализации все реализации JavaScript, которые следуют спецификации EcmaScript право, даст вам объектно-ориентированный язык. Согласно стандарту ES:

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

Итак, теперь, когда мы договорились, что JavaScript является реализацией EcmaScript и поэтому является объектно-ориентированным языком. Определение new операция в любом объектно-ориентированном языке, говорит, что такое ключевое слово используется для создания экземпляра объекта из класса определенного типа (в том числе анонимных типов, в таких случаях, как C#).

в EcmaScript мы не используем классы, как вы можете прочитайте из спецификации:

ECMAScript не использует такие классы, как в C++, Smalltalk или Java. Вместо этого объекты могут быть созданы различными способами, в том числе через литеральная нотация или через конструкторы, которые создают объекты, а затем выполняют код, который инициализирует все или часть из них, назначая начальное значение значения их свойств. Каждый конструктор-это функция, которая имеет свойство ― прототип ‖, который используется для реализации наследования на основе прототипов и общие свойства. Объекты создаются с помощью
использование конструкторов в новых выражениях; например, new Дата(2009,11) создает новый объект Date. Вызов конструктора без использования new имеет последствия, которые зависят от конструктора. Например, Date () создает строковое представление текущая дата и время, а не объект.

The new ключевое слово изменяет контекст, в котором выполняется функция, и возвращает указатель на этот контекст.

The new ключевое слово создает экземпляры объектов с помощью функции конструктора. Например:

экземпляры наследуются от prototype функции-конструктора. Так что приведем пример выше.

резюме:

The new ключевое слово используется в javascript для создания объекта из функции конструктора. Элемент new ключевое слово должно быть помещено перед вызовом функции конструктора и будет делать следующие вещи:

пример:

что именно происходит:

Источник

Что такое «новое» ключевое слово в JavaScript?

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

13 ответов

Ну, JavaScript на Си может сильно отличаться от платформы к платформе, поскольку это всегда реализация оригинальной спецификации EcmaScript.

В любом случае, независимо от реализации, все реализации JavaScript, которые соответствуют спецификации EcmaScript, дадут вам объектно-ориентированный язык. Согласно стандарту ES:

В EcmaScript мы не используем классы, как вы можете прочитать из спецификации:

Ключевое слово new создает экземпляры объектов, используя функции в качестве конструктора. Например:

Резюме:

Ключевое слово new используется в javascript для создания объекта из функции конструктора. Ключевое слово new должно быть помещено перед вызовом функции конструктора и будет выполнять следующие действия:

Примере:

Что именно происходит?

Ключевое слово new изменяет контекст, в котором выполняется функция, и возвращает указатель на этот контекст.

Иногда код легче слов:

Для меня, пока я не являюсь прототипом, я использую стиль func2, поскольку он дает мне немного больше гибкости внутри и снаружи функции.

Уже есть несколько очень хороших ответов, но я публикую новый, чтобы подчеркнуть мое наблюдение в случае III ниже о том, что происходит, когда у вас есть явный оператор возврата в функции, которой вы являетесь <> вверх. Посмотрите на следующие случаи:

Случай I :

Случай II :

Цитирование Дэвида Фланагана из JavaScript: Полное руководство (6-е издание), гл. 4, страница № 62:

Когда выражение создания объекта оценивается, JavaScript сначала создает новый пустой объект, такой же, как тот, который создан инициализатором объекта <>. Затем он вызывает указанную функцию с указанными аргументами, передавая новый объект в качестве значения ключевого слова this. Затем функция может использовать это для инициализации свойств вновь созданного объекта. Функции, написанные для использования в качестве конструкторов, не возвращают значение, а значением выражения создания объекта является вновь созданный и инициализированный объект. Если конструктор возвращает значение объекта, это значение становится значением выражения создания объекта, и вновь созданный объект отбрасывается.

Функции, используемые в фрагменте кода вышеупомянутых случаев, имеют специальные имена в мире JS, как показано ниже:

Вы можете прочитать о различиях между ними в этой теме.

JavaScript является объектно-ориентированным языком программирования и используется именно для создания экземпляров. Он основан на прототипах, а не на классах, но это не значит, что он не объектно-ориентирован.

так что это, вероятно, не для создания экземпляров объекта

Это используется именно для этого. Вы определяете конструктор функции так:

Все объекты, созданные из этого конструктора, теперь будут иметь getName из-за цепочки прототипов, к которым они имеют доступ.

Для начинающих, чтобы понять это лучше

Попробуйте следующий код в консоли браузера.

Теперь вы можете прочитать ответ вики сообщества 🙂

В дополнение к ответу Дэниела Ховарда, вот что new делает (или, по крайней мере, кажется) делает:

Предположим, у вас есть эта функция:

Если вы вызываете это как отдельную функцию, например:

Теперь назовите это так new :

Источник

Модификатор new (справочник по C#)

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

Скрытие имен через наследование принимает одну из следующих форм.

Метод, введенный в классе или структуре, скрывает свойства, поля и типы с тем же именем в базовом классе. Кроме того, он также скрывает все методы базового класса, имеющие такую же сигнатуру.

Индексатор, представленный в классе или структуре, скрывает все индексаторы базового класса, имеющие одинаковую сигнатуру.

Совместное использование модификаторов new и override в одном члене является недопустимым, так как эти два модификатора имеют взаимоисключающие значения. Модификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена.

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

Примеры

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

В случае удаления модификатора new программа продолжит компиляцию и выполнение, однако появится следующее предупреждение.

Спецификация языка C#

Дополнительные сведения см. в разделе Модификатор new в спецификации языка C#.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *