Câu hỏi về hàm khởi tạo sau hàm main C++

Em có 1 đoạn code như sau:

#include <string>
#include <iostream>
using namespace std;
class S {
public:
    string name_;
    S(string const& name) : name_(name) { cout << "create " << name << endl; }
    ~S() { cout << "destroy " << name_ << endl; }
};

S one("one");

int main() {
    S two("two");
    //eleven.name_; error 'eleven' was not declared in this scope
}

S eleven("eleven");

cho output là:

create one
create eleven
create two
destroy two
destroy eleven
destroy one

Mọi người cho em hỏi là tại sao hàm khởi tạo của eleven lại được gọi trước two và tại sao hàm khởi tạo của eleven được dùng rồi mà lại không sử dụng được eleven.

Nói về vấn đề này trước, khi bạn sử dụng eleven, compiler cần phải biết evelen là cái gì để gọi, và điều này xảy ra lúc compile time. Mà compiler thì đọc file theo thứ tự từ trên xuống, đến chỗ trong main vẫn chưa thấy eleven ở đâu => bị báo lỗi compile

Về vấn đề này, có 2 ý:

  • Đầu tiên là hàm khởi tạo là được chạy lúc runtime, mà scope của oneeleven là global, nên storage của nó là static, còn scope của two là trong hàm main, storage là automatic => oneeleven được khởi tạo trước two
  • Tiếp theo là tại sao eleven lại được khởi tạo trước one: https://en.cppreference.com/w/cpp/language/siof (ngắn gọn là C++ nó không qui định thứ tự khởi tạo cho mấy cái thằng static storage này, nên compiler muốn làm sao thì làm)
2 Likes

eleven khởi tạo sau one mà :V Câu hỏi là tại sao eleven tạo trước two thì ý đầu tiên đã cover rồi :V

Within a single translation unit, the fiasco does not apply because the objects are initialized from top to bottom.

ở đây cùng 1 translation unit thì bảo đảm one khởi tạo trước eleven mà. Khác unit thì làm sao mà bảo đảm unit nào compile trước unit nào compile sau được =]

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?