C++
11. 클래스, 접근제어자 ,생성자 소멸자
seqw
2021. 5. 20. 23:58
1. 정적 할당과 동적 할당.
#include"MainGame.h" // #include로 헤더 선언. 기본적으로 있는 것 말고
//따로 만든건 <>가 아니라 ""로 표기
void main()
{
//정적 할당.
//런타임 도중 삭제 불가(컴파일러 이전 단계에서 메모리를 잡고 들어옴)
// 스택 영역에 메모리 잡힘.
MainGame mg1;
MainGame mg2;
MainGame mg3;
//생성이 mg1 mg2 mg3 순으로 생성이 되는데
//소멸도 mg1 mg2 mg3 순으로 소멸이 됨.
//이를 후입선출,스택,LIFO(Last In First Out) 이라 함.
//반대로 선입선출도 있는데 그걸 큐,FIFO(First in First Out) 이라 함.
//동적 할당.
//컴파일러 끝나고 메모리를 힙 영역에서 빌려옴
//런타임 도중 삭제 가능
//힙영역에 메모리 잡힘
//지정 주차구역이 없어서 주차할곳 찾아다닌다 생각하면 편함
MainGame* mg4 = new MainGame;
delete mg4; //이걸로 소멸
}
2. 클래스 생성
클래스를 만들면 저렇게 헤더와 cpp가 만들어진다.
헤더에는 변수나 함수 선언을 하고 나머지는 cpp에서 하는게 좋아보임.
2-1.접근제어자
Test01.h
#pragma once // #include를 사용해서 잡히는 데이터를 한번만 잡게 해준다함.
#include<iostream>
class Test01//class 이름
{
private:
int x; // 클래스 내부에서만 사용 가능한 변수
protected:
int i; // 클래스 내부와 상속된 자식 클래스에서만 사용 가능한 변수
public:
void Test(); // 함수 선언
void Test1(int i);
};
1.private: 접근제어자중에서 가장 빡쌤 외부 공개없이 내부에서만 사용 가능
2.protected: 클래스 내부와 상속된 자식 클래스에서만 사용가능
3.public: 누구나 사용가능
2-2 .
Test01.cpp
void Test01::Test()
{
std::cout << "Hi!" << std::endl;
}
void Test01::Test1(int i)
{
std::cout << i;
}
1. 헤더에서 #include<iostream>을 넣어서 여기엔 쓸 필요가 없음!
2-3.
main
#include<iostream>
#inlucde"Test01.h" // #include"Test01.h" Test01.h선언
void main()
{
int i = 10;
Test01 t; //인스턴스 생성.
t.Test(); //Test01 내에 있는 void Test() 함수를 사용
t.Test1(i); //Test01 내에 있는 void Test1(int i) 함수를 사용
}
1. 실행하면
Hi!
10
2.이라 출력한다.
3.메인함수 위에 따로 함수 만들어서 선언해주고 하는거랑 비슷함.
3-1. 생성자 소멸자
Test01.h
#pragma once
#include<iostream>
class Test01
{
public:
Test01();
~Test01();
};
1. Test01(); 생성자: 객체가 생성될때 실행됨.
2. ~Test01();소멸자: 객체가 소멸될때 실행됨.
3-2.
Test01.cpp
void Test01::Test01()
{
std::cout << "Hi!" << std::endl;
}
void Test01::~Test01()
{
std::cout << "Bye!" << std::endl;
}
1. 생성자와 소멸자에 각각 Hi! 와 Bey! 를 출력하게 만들었다.
3-3.
main
#include<iostream>
#inlcude"test01.h"
void main()
{
Test01 test;
}
1. 이렇게 하면 객체가 생성되면서 생성자가 실행되어 Hi! 라고 출력한다.
2. 이후 객체가 소멸하면서 소멸자가 실행되어 Bye! 라고 출력한다.