我应该在C ++中使用构造函数或init函数

时间:2017-07-22 04:55:55

标签: c++ constructor

B班有A班成员m_a

class A{
    A(...);
    ~A();
    init(...);
    ...//other methods;
    ...//data
    }

为了用某个值初始化m_a,我可以使用构造函数或init()函数。 如果我使用构造函数,并且无法在B类构造函数中决定该值,那么我将不得不使用A* m_anew A(...)进行初始化。 或者如果我使用init()函数,我可以使用A a作为B类的成员。 那么在这种情况下init()函数是一种更好的方法吗?

3 个答案:

答案 0 :(得分:2)

你应该更喜欢在构造函数或内联中​​直接初始化所有成员(直接在你声明它们的地方),除非你有的理由不这样做。

如果您使用init - 样式函数,则可以使用尚未初始化的对象。

我建议在不知道m_a应该具有什么值的情况下实例化B对象是不可能的。为此,您应该使用B的构造函数来获取A参数:

class B {
public:
    explicit B(A a)
        : m_a(std::move(a))
    { }

private:
    A m_a;
};

这样,在不知道应该使用B进行初始化的情况下创建m_a对象是不可能的:

B b; // error

B的用户被迫提供B::m_a的值,因此无法使用未初始化的B对象:

B b(A());

如果您想知道std::move是什么,它允许将a参数移动到m_a成员而不复制,这更快。要阅读更多相关信息,请搜索" C ++移动语义"。但是,这是可选的,并不是上述示例所必需的。

答案 1 :(得分:0)

我不确定我理解你的pb,但最终我会选择构造函数。

struct A{
    A(int a = 0):a_(a);{}
    a_:
}

struct B{
    B(int b = 0):A_(b);{}
    A_ get_A(){ return A_;}
    A A_
}

如果您需要更新init的函数,我将创建一个自由函数

void foo(A& a){
     //whatever 
}

然后B返回A_并使用foo

的方法
B b;
foo(b.get_A());

这是一种可能的方法。请记住C ++构造函数初始值,并且至少给出默认值0.我的2美分,希望它有所帮助

答案 2 :(得分:0)

如果您有多个构造函数都需要相同的初始化代码,那么将该代码放在init函数中可以在修改类时减少冗余和错误。否则,构造函数本身就更有意义了。

某些构造无法在构造函数的初始化列表之外进行初始化,例如const或引用成员。对于那些你将别无选择,除了在每个构造函数中初始化它们。