【问题标题】:C++ Object Constructor with Temporary Object as Argument以临时对象为参数的 C++ 对象构造函数
【发布时间】:2013-08-29 13:02:59
【问题描述】:

我写了一些代码,突然想到我正在做的事情可能是一个非常糟糕的主意。这是一个抽象的例子。关键是向量的引用传递。

// vector.hpp
class vector {
    vector(double x, double y, double z);
}

// particle.hpp
class particle {
    particle(const vector& _init_position);
    vector m_position;
}

所以我写了一些代码来表示一个class vector,其中包含3D向量的东西,还写了一个粒子类,它的位置向量可以用构造函数和向量实例初始化。

在我的main() 函数中,我使用了一个临时对象来初始化粒子对象,如下所示:

int main() {

    particle my_particle(vector(0.0, 1.0, 2.0)); // Temp vector instance - problem?
}

这里可以看到创建了一个临时的vector实例,我假设它是放在栈上某处,然后调用了particle的构造函数。

这可以吗,还是它是一个非常糟糕的代码示例?我怀疑是后者,因为我是通过引用传递的,因此临时向量的实例可能无效?

希望有人能澄清一下吗?

【问题讨论】:

  • 你应该阅读 rval 参考资料
  • 完全没问题。无时无刻不在发生。例如,每当您将"Hello" 传递给采用const std::string& 的函数时
  • @IgorTandetnik Argh,应该想到那个例子!

标签: c++ vector initialization object-initializers temporary-objects


【解决方案1】:

您可以将临时对象作为值或常量引用参数传递给函数。这是一件好事,因为您可以在通过 const 引用传递时保存副本。

【讨论】:

  • 为什么它必须是 const 引用?我注意到没有 const 将无法编译。
  • @EdwardBird 没有技术原因(因为 Visual Studio 支持它作为扩展),只是不允许。我相信他们认为这会鼓励不良的编码实践。
  • 好吧,我想这很公平。一切都必须是 const 等等。
【解决方案2】:

你没有展示向量构造函数的实现,但是成员是一个值,所以我假设构造函数正在将它的参数复制到成员。如果是这种情况,那么传递一个 const ref 正是你想要做的,以避免不必要的复制。

您不想做的是保留对该参数的引用(或地址)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2010-12-22
    • 2016-10-10
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多