【问题标题】:Its so strange to use constructor just like a function, is it normal?像函数一样使用构造函数很奇怪,正常吗?
【发布时间】:2020-02-24 16:31:48
【问题描述】:

它是一个构造函数,所以出现了一个新的向量实例。这是需要删除还是添加完成后会自动删除?

struct vect
{
   vect() {}
   vect(vect a, vect b, double Force) {}
};

int main()
{
   vect b, c; 
   double d;

   vect k = a + vect(b, c, d);
}

(假设 a 和附加功能在别处声明。)

【问题讨论】:

    标签: c++ class constructor


    【解决方案1】:

    尽管看起来,这不是“像函数一样使用构造函数”。

    其实是演员表,using something called "functional cast notation"

    它采用一个或多个值(在本例中为 bcd)并从中生成一个 vect

    是的,这将涉及在幕后为您调用vect(vect, vect, double) 构造函数;它必须。但这并不是创建对象的唯一内容,即使只是在概念上。所有这些东西结合起来给你一个真实的、会呼吸的对象,它存在于所有正常的范围规则中。

    所以,不,您不会发生内存泄漏。

    事实上,“像函数一样调用构造函数”是不可能的,因为constructors have no names。尽管委托构造函数的语法很接近,但根本没有语法可以做到这一点。

    但是,这种常见的误解在实践中可能并不重要,只要您不开始认为您正在设法以某种方式跳过对象创建的其他部分(例如为其创建内存),例如你在你的问题中做了。 ?

    你正在做的通俗说法是“创造一个临时的”,是的,这是完全正常的。

    因为它是一个临时变量(即一个未命名的变量),它会在语句结束时自动销毁(正式地,在创建它的 full-expression 结束时)。但是,大概您的 + 操作已经复制了它或到那时。

    【讨论】:

    • 用了好久,今天感觉有点奇怪,虽然每次写“a+3”的时候无疑都会出现这样的情况……这是一种奇怪的感觉
    • @Kelbon 倒一杯烈性酒,你会没事的 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多