Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数的执行顺序_C++_C++11 - Fatal编程技术网

C++ 构造函数的执行顺序

C++ 构造函数的执行顺序,c++,c++11,C++,C++11,这段代码做了我期望它做的事情吗?也就是说,句柄(curl\u easy\u init())部分是在构造函数体执行之前还是之后调用的 class oauth2 { public: oauth2() : handle_(curl_easy_init()) { if (handle_ == NULL) { throw new runtime_error("curl_easy_init return null"); } }

这段代码做了我期望它做的事情吗?也就是说,句柄(curl\u easy\u 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_;
};
谢谢

是的

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

句柄(curl\u easy\u 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_;
};
它在构造函数体执行之前被调用


C++标准n3337§12.6.2.10:

初始化基和成员 在非委托构造函数中,初始化在 顺序如下:

-首先,并且仅适用于大多数 派生类(1.8),虚拟基类按以下顺序初始化 它们出现在定向对象从左到右的深度优先遍历上 基类的非循环图,其中“从左到右”是 派生类中基类的外观 基本说明符列表

-然后,在中初始化直接基类 在基本说明符列表中显示的声明顺序 (无论mem初始值设定人的顺序如何)

-然后,非静态 数据成员按照在中声明的顺序进行初始化 类定义(同样,不考虑 mem初始值设定项)

-最后,对 构造函数体被执行


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

。这很容易检查。快速查找的方法是将类似于
std::cout的内容放在使用成员/基初始值设定项列表的一点上,而不是将所有内容都放在主对象的构造函数中。更正确的是,在计算构造函数体语句之前构造成员对象,两者都是构造包含对象过程的一部分。构造函数返回之前没有包含对象