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参数。构造函数还可以创建对象吗?
答案 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
具有构造函数(只有用户定义的类型才具有实际的构造函数/析构函数)。
因此,并不是“正在调用恰好创建对象的构造函数”;相反,您是“创建一个对象,可能涉及调用构造函数”。