我的片段如下,目的是正确初始化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()...)
答案 0 :(得分:0)
声明不调用默认构造函数。成员变量在构造函数中初始化。如果您害怕初始化不正确,请删除A
的默认构造函数,以便编译器为您指出。
由于每个成员变量需要以不同方式初始化,因此您必须为这些成员变量创建单独的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.
}
};