哪个在Qt中更有效:带有参数的构造函数或之后带有setter的默认构造函数?

时间:2011-12-18 01:24:04

标签: c++ constructor setter object-construction

问题与标题中一样。

例如:

QPropertyAnimation *animation;
animation = new QPropertyAnimation(this, "windowOpacity", this);

QPropertyAnimation animation;
animation.setTargetObject(this);
animation.setPropertyName("windowOpacity");
animation.setParent(this);

哪个更有效?

编辑:虽然它没有显着差异,除非反复进行,我仍然想知道,我宁愿想要答案而不是意见 - 如stackoverflow的指导原则所示。

4 个答案:

答案 0 :(得分:5)

首先,为什么第一个例子中有new?我假设您将在同一存储(堆/堆栈)上创建两个变量。

其次,这不是Qt的问题,它一般适用于C ++。

如果没有任何关于您正在创建的类的先验知识,您可以确定一件事:具有参数版本的构造函数至少与制定者版本

这是因为,在最坏的情况下,构造函数可能看起来像这样:

QPropertyAnimation(QObject* target, const QByteArray & prop_name, QObject* parent = 0)
{
  // members are default initializer, now explicitly set
  this->setTargetObject(target);
  this->setPropertyName(prop_name);
  this->setParent(parent)
}

然而,任何的人至少通过一本好书来编写这样的构造函数:

QPropertyAnimation(QObject* target, const QByteArray & prop_name, QObject* parent = 0)
  : m_target(target)
  , m_prop_name(prop_name)
  , m_parent(parent)
{
  // members explicitly initialized
}

答案 1 :(得分:1)

无论是一次调用还是三次调用(OK,2.5,因为第一次调用是隐式的)是“更好”(忽略堆问题),值得思考程序的概念流程,以及你的智力控制权它。并且还值得考虑与编码相关的实际问题。

在调用者方面,如果所有适当的参数已经存在于创建对象的位置,那么单个调用使得更确切地说,实际上所有参数都“属于”该对象,并且正在创建它“完好无损”。另一方面,如果使用单个调用意味着调用代码必须随时间收集参数然后吐出一个“被压抑”的调用,那么创建对象然后设置相应的属性可能是更好的选择随着他们的价值观的发展,一次一个。

而且,在被叫方方面,可能存在实际考虑因素。例如,可能存在十几个属性,对象的不同用途可能使用不同的组合。提供单个构造函数(或少数构造函数)与多个属性设置器相结合,而不是提供许多不同的构造函数,这对于编程器时间更有效,并且更不容易使对象的用户感到困惑。但是,如果(几乎)总是使用相对少量参数的相同组合,则单个调用可能更好地利用程序员资源。

(这里的一些重要事实是C ++没有实现真正的关键字参数,所以当参数列表超出4-5项时,会失去对哪个参数的智能控制,特别是如果有几种形式的构造函数。在这种情况下,使用单独的属性设置器可以提供关键字参数的(粗略)效果,并减少混淆的可能性。)

效率并不总是与CPU周期有关。在许多方面,有效利用程序员时间(包括缩短调试时间)更为重要。

答案 2 :(得分:0)

其他条件相同,一个函数调用优于3。

答案 3 :(得分:0)

你在比较苹果和橘子。在第一种情况下,您正在从堆构造对象,而在第二种情况下,您正在“在适当位置”,在另一个对象或自动存储中构建对象,因此没有堆开销。与使用单个构造函数调用还是(隐式)构造函数加两个setter无关。