Зачем нам нужно создавать конструктор с одним аргументом, чтобы использовать временные безымянные объекты? - PullRequest
1 голос
/ 25 октября 2019

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

Classname temp;
temp.variable=variable;
return temp;

Вы могли бы сделать это:

return Classname(variable);

Но для этого выТакже необходимо создать конструктор с одним аргументом, например так:

Classname(int c): variable(c)
{ }

У меня вопрос: зачем нам этот конструктор с одним аргументом? Я искал в Интернете много и не могу найти причину. Итак, мне действительно нужна ваша помощь, ребята. Благодаря.

1 Ответ

4 голосов
/ 25 октября 2019

Вам не нужно. Вместо этого можно использовать агрегатная инициализация :

struct Classname {
    int variable;
};
// ...
return Classname{42};

. Создается объект класса, единственный нестатический член которого инициализируется значением 42.

Агрегированная инициализацияподлежит некоторым ограничениям. Логика заключается в том, что только типы, которые в некотором смысле аналогичны структурам C - являются группами данных без инвариантов - должны быть приемлемыми. Если вы усложняете тип, добавляя конструкторы или скрывая некоторые элементы с помощью контроля доступа, вы, вероятно, намереваетесь, чтобы члены не были инициализированы напрямую без прохождения через какой-либо конструктор или некоторые методы установки. Так что в этом случае это не разрешено;вместо этого должен быть определен соответствующий конструктор.

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