c ++我可以在构造函数中声明类成员并对其进行初始化吗?

Posted

技术标签:

【中文标题】c ++我可以在构造函数中声明类成员并对其进行初始化吗?【英文标题】:c++ can i declare class member and initialized it in the constructor [duplicate] 【发布时间】:2012-09-18 08:31:05 【问题描述】:
class Monitor 
public:
    Monitor(string someData);
    Person person_;


class Person 
public:
    Person(string personId);

Person 没有默认构造函数。它有一个参数构造函数。 我只能在 inside Monitor 构造函数中初始化它。 我来自java,声明只是指针,所以声明时不需要初始化新实例。

对于没有默认构造函数的类成员的最佳实践是什么? 我应该添加默认构造函数(缺点 - 没有用)还是使用指针。

【问题讨论】:

【参考方案1】:

是的,你可以,而且你总是应该,通过构造函数初始化列表

class Monitor

    Person p; 
    bool   state;
    const  int n;
    double & d;

    Monitor(std::string const & pname, double & dbl)
    : p(pname)
    , state(false)
    , n(some_other_function(p, state))
    , d(dbl)
    
         // constructor body should be as short as possible
    

    // ...

;

如您所见,初始化不仅仅是一个噱头;相反,它是 C++ 类型系统的一个深刻的必要性:有很多变量必须被初始化并且不能被赋值,例如常量和引用,还有没有默认构造函数的用户定义类型。 (即使有 个默认构造函数,您也需要一个赋值运算符,而且在任何情况下构造一个您不想稍后再覆盖它的东西仍然是一种浪费。)

还要注意你的类成分的构造顺序:当你创建你的类的一个新实例时,首先构造成员对象,按照它们在类定义中声明的顺序,但是按照初始化列表中的指定进行初始化。所有成员构造完成后,构造函数的body运行。

实际上,在成员对象之前还构造了另一件事:基础子对象。自然地,它们的初始化器也在初始化器列表中:

struct Foo  Foo(int, bool);               /* ... */ ;
struct Bar  Bar(std::string const &, int) /* ... */ ;

class Monitor : public Foo, private Bar

    Person p;

    Monitor(std::string const & pname, int a, int b)
    : Foo(a, a == b)
    , Bar(pname, b)
    , p(pname)
    
        // constructor body
    

    // ...
;

强烈建议(尽管不强制)在构造函数初始化器列表中按照它们的执行顺序编写初始化器!

【讨论】:

我只能在 Monitor 构造函数中初始化它。 @user1495181:创建一个辅助函数,就像我为 n 所做的那样!

以上是关于c ++我可以在构造函数中声明类成员并对其进行初始化吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用移动语义在构造函数中初始化类成员

在构造函数中调用类成员的构造函数

是否可以使用 for 循环在构造函数中声明二维数组类成员?

在c ++ 11中使用一个随机引擎进行多分布

运行时在构造函数中初始化向量类成员——C++

Kotlin:在构造函数中初始化类属性