簡體   English   中英

STL中構造函數調用的順序

[英]Order of constructor call in STL

我最近閱讀了簡單的STL源碼,下面是代碼:

#include <iostream>
#include <cstddef>

using namespace std;

class alloc
{

};

template <typename T, typename Alloc = alloc, size_t Bufsiz = 0>
class deque
{
public:
    deque() { cout << "deque()" << endl; }
};

template <typename T, typename Sequence = deque<T> >
class stack
{
public:
    stack() { cout << "stack()" << endl; }
private:
    Sequence c;
};


int main()
{
    stack<int> x;

    return 0;
}

輸出:

deque()
stack()

當我創建一個堆棧對象時,它應該首先調用堆棧構造函數。但是事實並非如此。

為什么編譯器首先調用deque構造函數?

在輸入構造函數的主體之前,將調用基類構造函數,然后所有非靜態成員變量均按照聲明的順序進行默認初始化,除非它們出現在成員初始化列表中。 在您的代碼中, Sequence c首先被初始化,然后執行Stack::Stack()的主體。

該程序說明了構造順序-破壞。

#include <iostream>
#include <string>

using namespace std;

struct Base_1
{
    Base_1()
    {
        cout << "Base_1\n";
    }
    ~Base_1()
    {
        cout << "~Base_1\n";
    }
};

struct Base_2
{
    Base_2()
    {
        cout << "Base_2\n";
    }
    ~Base_2()
    {
        cout << "~Base_2\n";
    }
};

struct Member_1
{
    Member_1()
    {
        cout << "Member_1\n";
    }
    ~Member_1()
    {
        cout << "~Member_1\n";
    }
};

struct Member_2
{
    Member_2()
    {
        cout << "Member_2\n";
    }
    ~Member_2()
    {
        cout << "~Member_2\n";
    }
};

struct Member_non_default
{
    Member_non_default( string s )
    {
        cout << "Member non default\n";
    }
    ~Member_non_default()
    {
        cout << "~Member non default\n";
    }
};

struct Static_member
{
    Static_member()
    {
        cout << "Static member\n";
    }
    ~Static_member()
    {
        cout << "~Static member\n";
    }
};

struct Derived: Base_1, Base_2
{
    Member_1 m1;
    Member_non_default m;
    Member_2 m2;
    static Static_member sm;

    Derived():
        m { "Member non default\n" }
    {
        cout << "Derived\n";
    }
    ~Derived()
    {
        cout << "~Derived\n";
    }
};

Static_member Derived::sm;

int main()
{
    Derived d;
}

輸出量

靜態成員
Base_1
Base_2
會員_1
會員非默認
成員_2
派生
〜衍生
〜成員_2
〜會員非默認
〜成員_1
〜Base_2
〜基礎_1
〜靜態成員

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM