Это так странно использовать конструктор, как функцию, это нормально? - PullRequest
0 голосов
/ 24 февраля 2020

Это конструктор, поэтому появляется новый экземпляр вектора. Означает ли это, что его нужно удалить или оно будет автоматически удалено после завершения добавления?

struct vect
{
   vect() {}
   vect(vect a, vect b, double Force) {}
};

int main()
{
   vect b, c; 
   double d;

   vect k = a + vect(b, c, d);
}

(Предположим, a и функция добавления объявлена ​​в другом месте.)

1 Ответ

1 голос
/ 24 февраля 2020

Несмотря на видимость, это не"использование конструктора как функции".

Это на самом деле приведение, с использованием чего-то, называемого "функциональным" приведение нотации ".

. Оно принимает одно или несколько значений (в данном случае b, c и d) и делает из них vect.

Да, это будет включать в себя вызов конструктора vect(vect, vect, double) для вас за кулисами; он должен. Но это не единственное, что связано с созданием объекта, хотя бы концептуально. Все эти другие вещи в совокупности с дают вам реальный, дышащий объект , который существует во всех нормальных правилах области видимости.

Итак, нет, вы не получите утечку памяти.

Фактически невозможно «вызвать конструктор как функцию», поскольку конструкторы не имеют имен . Для этого просто нет синтаксиса, хотя синтаксис для делегирования конструкторов близок.

Однако это распространенное заблуждение, возможно, не имеет большого значения на практике, если вы не начинаете думать, что вы Вам удается как-то пропустить другие части создания объекта (например, создание памяти для него), как вы делали в своем вопросе. 10

Разговорным термином для того, что вы делаете, было бы «создание временного» и, да, это совершенно нормально.

Поскольку это временный (то есть переменная без имени), она автоматически уничтожается в конце оператора (формально, в конце полного выражения , в котором она была создана). Однако, вероятно, ваша + операция уже скопировала его или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...