使用初始化列表来处理使用不同初始化方法的对象?

时间:2015-02-18 15:20:24

标签: c++

我的片段如下,目的是正确初始化B类。

   class A
    {
    private:
        double params;
    public:
        A(){}
        A( std::vector<double> const& _x ) : x( _x ) 
         {/*..do something ..*/}

       double Somefunction();// function body defined elsewhere

    };

    class B
    {
       public:
       A a1;     // declaration call default constructor?
       A a2;
       B( std::vector<double>& x,std::vector<double>& y )
        : a1(x),a2(f(y))) 
        {}

       const std::vector<double>& f(std::vector<double>& y) const;

    }

    const std::vector<double> &B::f(std::vector<double>& y) const
    {
    /... do sth .../
    }

我有两个问题:

在类B中,

声明是否为A调用默认构造函数?或者它只是一个声明。

如果我在B,a2,a3,a4,a5 ......中得到了一堆A objs,并且他们的初始化方法“f()”不同但有一些共同点,所以我想在其中初始化它们构造函数体,是否可能? (否则我需要定义f2(),f3(),f4(),f5()...)

2 个答案:

答案 0 :(得分:0)

  1. 声明调用默认构造函数。成员变量在构造函数中初始化。如果您害怕初始化不正确,请删除A的默认构造函数,以便编译器为您指出。

  2. 由于每个成员变量需要以不同方式初始化,因此您必须为这些成员变量创建单独的fN()方法

答案 1 :(得分:0)

可能最简单的解释方法是查看&#34;虚拟&#34;的两个版本。同样的事情并讨论差异。

方式,class Outer通常不会使用它,因为对默认构造函数的额外调用。 class Outer2可以避免额外的通话。

class Member 
{ 
    int x; 
public: 
     Member(int xv)
         :x(xv)
     {} 
     void SetX( int v ) { x = v; }
};
// Init member in function body:
class Outer
{
    Member m;
public:
    Outer( int v ) // "invisibly" calls Member default constructor
        // : m()     <<-- doing that explicitely is considered good style. 
    { // Here, m is already fully constructed.
        m.SetX(v);
    }
};
// Init member with initializer list
class Outer2
{
     Member m;
public:
     Outer2( int v )
          : m(v)   // Calls constructor Member::Member( int )
     { // Again, m is fully constructed from here on

          // Of course it is possible to call m.SetX( 42 ) here.
     }
};