Какие аргументы приводит новое?

Вызывает ли new в C++ конструктор за кулисами? Или это наоборот?

Я видел такой код, как new MyClass(*this), который меня смущает, так как я не знал, что new может принимать аргументы.

Может быть, это потому, что new может вызвать конструктор и, как следствие, может принимать аргументы, объявленные конструктором?

@appleapple Это не новое размещение

NathanOliver 04.01.2023 16:53

Хотя это неплохой вопрос, это признак того, что вам нужна хорошая книга по C++. Конструктор может принимать все виды аргументов. Почему вы думаете иначе? Как еще std::string строится с уже существующим значением?

tadman 04.01.2023 16:53

@NathanOliver, о да. это просто аргумент конструктора

apple apple 04.01.2023 16:53
new MyClass(*this) вызывает конструктор, вы передаете аргументы конструктору, а не самому new.
Quimby 04.01.2023 16:54

Посмотрите на cppreference (2)

Jarod42 04.01.2023 16:54

Выражение new MyClass(*this) действительно приводит к вызову конструктора, при условии, что память для объекта была успешной. Это не отличается от выражения new MyClass; последний просто использует конструктор, который работает без указания каких-либо аргументов конструктора...

fabian 04.01.2023 17:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
122
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это не new аргументы, это конструктор принимает аргументы.

Возможно, вам потребуется добавить учебник о разнице между новым выражением и новым оператором.

Spencer 04.01.2023 16:56

MyClass(*this) создает объект типа MyClass, вызывая его конструктор и передавая *this в качестве аргумента. Помещение new за ним означает, что объект размещается в куче, а не в стеке. Не new принимает аргумент, а MyClass.

Ответ принят как подходящий

Есть разница между new и operator new. Оператор new использует скрытую функцию operator new для выделения памяти, а затем также «инициализирует значение» объекта, вызывая его конструктор с параметрами после имени класса.

В вашем случае вы вызываете new, который выделяет память с помощью ::operator new(), а затем инициализирует объект класса MyClass в этой памяти, используя конструктор с параметром *this.

#include <iostream>

class A {
    public:
        int m_value; 
        A(int value): m_value(value){};
};

int main (){

    int *a  = new int; 

    auto b= new A(1); 

    std::cout << *a << std::endl; 
    std::cout << b->m_value << std::endl; 
    printf("%02x ", *b);

}

Program returned: 
0
15
0f

Как видите, new для переменной a создает только указатель, который инициализируется значением до 0. Вот почему, когда мы разыменовываем его, мы получаем 0 (все биты все 0, int большую часть времени занимает 4 байта, а точка указателя до содержимого памяти = до 0x0000)

Но для переменной b мы передаем параметры. И если мы посмотрим на содержимое памяти объекта b, мы сможем прочитать 0f, что означает, что он содержит 15 (значение члена)

Я подозреваю, что путаница OP происходит из-за осознания того, что operator new можно переопределить. Возможно, стоит отметить, что оператор new вызывает operator new, а затем вызывает конструктор для этой памяти.

Mooing Duck 04.01.2023 17:23

Спасибо! @MooingDuck Я только что обновил фрагмент кода тем, что, как я понял, вы имели в виду. Пожалуйста, дайте мне знать, если вы думаете, что это неправильно!

Josh 04.01.2023 22:30

@Josh: я переформулировал ответ, чтобы, надеюсь, ответить на вопрос, не слишком углубляясь в загадочные подробности того, что такое инициализация значений или как работает переопределение operator new. Neofelis: Мне не нравится, что я внес столько изменений в твой пост, но, видимо, Джош все еще был в замешательстве. Я надеюсь, что правки в порядке.

Mooing Duck 05.01.2023 17:48

Для тех, кому интересно, это предлагает немного больше информации о переопределении operator new: coliru.stacked-crooked.com/a/897bc134e2cc56f0 Это интересно, но обычно бессмысленно, и лучше избегать этого загадочного уголка C++.

Mooing Duck 05.01.2023 17:48

Для любопытных этот ответ предлагает немного больше информации о том, как предоставить параметры самому operator new: stackoverflow.com/questions/34800940/parameters-to-operator-‌​new. tldr дополнительные параметры идут между new и именем класса. A* p = new("new-parameter") A("A-ctor-parameter");

Mooing Duck 05.01.2023 17:51

«int в большинстве случаев 4 бита» << нет, это 4 или 8 байтов, то есть 32 или 64 бита большую часть времени. также 0x0000 будет 2 байта / 16 бит (один полубайт имеет длину 4 бита или полбайта, и вы помещаете здесь четыре полубайта)

CherryDT 05.01.2023 17:56

Не беспокойтесь, ваши изменения были полезны. И вам удалось сохранить ответ «упрощение», чтобы не запутаться в деталях. Кстати, Джош, кажется, понял, потому что никаких новых хороших новостей

jdenozi 05.01.2023 17:57

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

jdenozi 05.01.2023 18:03

Другие вопросы по теме