构造函数执行的顺序

时间:2014-03-25 18:00:36

标签: c++ c++11

这段代码是否符合我的预期?意思是,在构造函数体执行之前或之后调用的handle_(curl_easy_init())部分是什么?

class oauth2 {
public:
    oauth2() : handle_(curl_easy_init()) {
        if (handle_ == NULL) {
            throw new runtime_error("curl_easy_init return null");
        }
    }
    ~oauth2() {
        curl_easy_cleanup(handle_);
    }
private:
    CURL * handle_;
};

由于

2 个答案:

答案 0 :(得分:3)

  

是之前或之后调用的handle_(curl_easy_init())部分   构造函数体执行?

在执行构造函数体之前调用它。


C ++标准版n3337 § 12.6.2.10:

初始化基础和成员

  

在非委托构造函数中,初始化继续进行   以下顺序:

     

- 首先,仅适用于最多的构造函数   派生类(1.8),虚拟基类按顺序初始化   它们出现在深度优先的从左到右的遍历中   基类的非循环图,其中“从左到右”是基数的顺序   派生类中基类的外观   基本符列表。

     

- 然后,在中初始化直接基类   声明顺序,因为它们出现在base-specifier-list中   (不管mem-initializers的顺序如何)。

     

- 然后,非静态   数据成员按照在其中声明的顺序进行初始化   类定义(再次无论顺序如何   MEM-初始化)。

     

- 最后,复合声明了   构造函数体被执行。

此摘录中的委托构造函数被定义为一个构造函数,它调用同一个类的另一个构造函数(因此它委托作业)。在这种情况下,前者称为主要构造函数,而后者称为目标构造函数

答案 1 :(得分:2)

在包含对象之前构造成员对象。