«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
04-20 07:45
관리 메뉴

lancelot.com

constructor 본문

프로그래밍

constructor

lancelot50 2022. 8. 5. 00:52
  • 생성자 호출 원리
#include<iostream>
struct BM	// BaseMember
{
	BM() { std::cout << "BM()" << std::endl; }
	~BM() { std::cout << "~BM()" << std::endl; }
};

struct DM	// DerivedMember
{
	DM() { std::cout << "DM()" << std::endl; }
	DM(int) { std::cout << "DM(int)" << std::endl; }
	~DM() { std::cout << "~DM()" << std::endl; }
};

struct Base
{
	BM bm;
	Base() { std::cout << "Base()" << std::endl; }
	Base(int a) { std::cout << "Base(int)" << std::endl; }
	~Base() { std::cout << "~Base()" << std::endl; }
};

struct Derived : public Base
{
	DM dm;
	Derived() { std::cout << "Derived()" << std::endl; }
	Derived(int a) { std::cout << "Derived(int)" << std::endl; }
	~Derived() { std::cout << "~Derived()" << std::endl; }
};

int main()
{
	Derived d1;
}

  1. 생성자, 소멸자 호출의 정확한 원리
    • 컴파일러가 "기반클래스" 및 "멤버데이터"의 생성자(소멸자)를 호출해주는 코드를 생성해 주는 것
  2. 생성자/소멸자 호출순서
    • 기반 클래스 멤버(BM)의 생성자
    • 기반 클래스 (Base)의 생성자
    • 파생 클래스 멤버(DM)의 생성자
    • 파생 클래스 (Derived)의 생성자
  3. 사용자가 생성자 호출 순서를 변경할 수 없다.
  4. 컴파일러가 생성한 코드는 항상 디폴트 생성자를 호출한다.

 

  • 생성자에서는 가상함수가 작동하지 않음