【问题标题】:Does calling the constructor directly outside the class implicitly create an object?直接在类外调用构造函数会隐式创建一个对象吗?
【发布时间】:2018-11-22 02:17:52
【问题描述】:
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 参数。构造函数也有创建对象的能力?

【问题讨论】:

    标签: c++ object constructor


    【解决方案1】:

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

    set(A());
    

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这个例子是我碰巧看到的,作者可能只是截取了一个片段。因为看到直接调用构造函数创建对象作为参数传给函数,之前不知道这个用法,只是想验证一下自己的想法。很高兴得到大家的帮助。
      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2013-06-20
      相关资源
      最近更新 更多