在构造函数初始化中重用临时值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在构造函数初始化中重用临时值相关的知识,希望对你有一定的参考价值。

在构造函数中初始化类的成员时,如何在多个点上使用相同的临时值?

例:

// for arbitrary T1, T2, T3
T2 foo(T1 const&);
T3 bar(T1 const&);

struct A {
  T2 const t2;
  T3 const t3;
  A() : t2(foo(T1())), t3(bar(T1())) {}
};

这是一个非常简化的例子,但t2t3都是根据T1的实例构建的。现在,如果我希望该对象在两个初始化中完全相同*我有一个问题,因为它没有名称。你有没有想法如何在没有C ++ 11构造函数调用构造函数的情况下解决这个问题,也没有添加一个调用A(T1())的虚拟类?


*像这样:

  A(T1 const& t1) : t2(foo(t1)), t3(bar(t1)) {}

动机:如果T1()实际上像new T(),对象的地址很重要,那么我必须在t2t3中讨论相同的对象。

答案

在构造函数初始化中重用临时的脏方法是添加伪参数。我并不热衷于这种技术,但是我知道的唯一一个给临时名字的人。我倾向于重新设计我的课程以避免这种情况。

struct A
{
    A( T1 temporary_ = T1() )
      : t2( foo( temporary_ ) )
      , t3( bar( temporary_ ) )

    T2 const t2;
    T3 const t3;
};
另一答案

从最近开始,Const引用可能默认为临时引用(我忘记这是否是C ++ 03或C ++ 11的补充):

A::A(const T & t = T()) : a(t), b(t) { }
//              ^^^^^^

(也许可以声明构造函数explicit,以防万一。)

另一答案

我会通过创建工厂方法来解决这个问题

// for arbitrary T1, T2, T3
T2 foo(T1 const&);
T3 bar(T1 const&);

struct A {
    T2 const t2;
    T3 const t3;
    static A createA() { return A(T1()); }

  private:
     A(const T1& t) : t2(foo(t)), t3(bar(t)) {}
};
另一答案

我会不惜一切代价避免这种情况,但如果必须,我会增加一个额外的成员:

struct A {
  T1 temp_;
  T2 const t2;
  T3 const t3;
  A() : temp_(), t2(foo(temp_)), t3(bar(temp_)) {}
};

以上是关于在构造函数初始化中重用临时值的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

为什么我不能在不同的数据类型中重用相同的值构造函数?

右值引用剖析

为啥在通过 const 引用传递临时值时调用复制构造函数?

如何为每个片段保存一个变量值以重用它? [关闭]