Создает ли объект вызов вне конструктора неявным образом? - PullRequest
0 голосов
/ 22 ноября 2018
class A
{
public:
    A() { cout << "constructor" << endl; };
    A(const A &) { cout << "copy constructor" << endl; };
    void operator()(int a, int b) { cout << "a+b" << endl; }
};
void set(A visit) {
    visit(1, 2);
}
int main()
{
    set(A());
    return 0;
}

Конструктор A () напрямую создает доступ к объекту, который передается параметру set неявным объектом.Конструктор также имеет возможность создавать объекты?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

У вас есть это задом наперед.A() создает объект типа A.Как часть этого процесса, этот синтаксис вызывает конструктор A, если он есть.В конце концов, вы можете сделать int(5), чтобы создать int, но это не значит, что int имеет конструктор (фактические конструкторы / деструкторы имеют только пользовательские типы).

Так что это не такна самом деле вы «вызываете конструктор, который создает объект»;вместо этого вы «создаете объект, который может включать вызов конструктора».

0 голосов
/ 22 ноября 2018

Да.Способ, которым вы строите объект в строке:

set(A());

, называется функциональным преобразованием типа записи.Это указано в разделе о конструкторах в проекте стандарта CPP.

Конструктор используется для инициализации объектов своего типа.Поскольку конструкторы не имеют имен, они никогда не обнаруживаются при поиске имен; однако явное преобразование типов с использованием функциональной нотации вызовет конструктор для инициализации объекта. [Примечание: синтаксис выглядит как явный вызов конструктора.- конец примечания]

complex zz = complex(1,2.3);
cprint( complex(7.8,1.2) );

Объект, созданный таким образом, не имеет названия.

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