直接在类外部调用构造函数是否隐式创建对象?

时间:2018-11-22 02:17:53

标签: c++ object constructor

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 :(得分:3)

是的。在该行中构造对象的方式:

set(A());

称为功能符号类型转换。这在CPP标准草案的constructors部分中进行了指定。

  

构造函数用于初始化其类类型的对象。因为构造函数没有名称,所以在名称查找过程中永远找不到它们。 但是,使用功能符号进行显式类型转换将导致调用构造函数来初始化对象。 [注意:语法看起来像是对构造函数的显式调用。 —尾注]

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

以这种方式创建的对象未命名。

答案 1 :(得分:2)

您有这个倒退。 A()创建一个类型为A的对象。作为此过程的一部分,此语法将调用A的构造函数(如果有)。毕竟,您可以执行int(5)来创建int,但这并不意味着int具有构造函数(只有用户定义的类型才具有实际的构造函数/析构函数)。

因此,并不是“正在调用恰好创建对象的构造函数”;相反,您是“创建一个对象,可能涉及调用构造函数”。