본문 바로가기

C++/기초

[C++] this, 생성자, 소멸자

  1. this
    • 멤버함수 호출 객체의 주소 값을 가진 포인터 변수
    • 모든 멤버함수의 0번째 매개변수
using namespace std;

class Test_class {
private:
    int test_value1_int;
    int test_value2_int; // 멤버변수 stack 영역에 저장됨

public:
    void set_value_method(int refer_a = 0, int refer_b = 0) { 
        // void set_test_value_method(Test_class *this, int refer_a, int refer_b ) {
        test_value1_int = refer_a;
        this->test_value2_int = refer_b; // 매개변수가 존재하는 멤버함수 내 this 사용
        // 멤버함수 code 영역에 저장됨
        cout << test_value1_int
            << " + "
            << test_value2_int
            << " = " 
            << test_value1_int + test_value2_int 
            << endl;
    }

    void set_this_method() {
        // void set_this_method(Test_class *this) {
        cout << "input int 1: ";
        cin >> this->test_value1_int; // 매개변수가 존재하지 않는 멤버함수 내 this 사용

        cout << "input int 2: ";
        cin >> this->test_value2_int;

        cout << "you are input " 
            << test_value1_int 
            << ", " 
            << test_value2_int << endl;
    }
};

    void set_this_method() {
        // void set_this_method(Test_class *this) {
        cout << "input int 1: ";
        cin >> this->test_value1_int;

        cout << "input int 2: ";
        cin >> this->test_value2_int;

        cout << "you are input " 
            << test_value1_int 
            << ", " 
            << test_value2_int << endl;
    }
};


void main() {
    // Heap 영역에서 동작
    Test_class test_object_1, test_object_2;

    test_object_1.set_value_method(1,2);
    cout << "test_object1 adress : " 
        << &test_object_1 
        << endl;

    test_object_2.set_this_method();
    cout << "test_object2 adress : " 
        << &test_object_2 
        << endl;

}
  1. 생성자
    • 객체 생성 시점 자동 호출 멤버함수
    • 멤버변수 초기화 (생성과 동시에 자동실행, 추가 실행해선 안됨)
    • 함수명이 클래스명과 동일함
    • return값이 없으므로 멤버함수에도 리턴값을 명시하지 않음
    • 오버로딩 가능
    • 콜론(:)을 사용하여 멤버변수 초기화 가능
using namespace std;


// parameter 매개변수
// reference 참조
// argument 인수
// 용어를 정리해야할듯 cpp뉴비(본인) 혼동..


class Test_class {
private:
    int test_value_int;
    char test_value_char;
public:
    Test_class() : test_value_int(0), test_value_char(' ') {
        /*
        Test_class() {
            test_value_int = 0;
            test_value_char = ' ';
        }
        과 동일하게 동작
        */
    }

    Test_class(int parameter_int_a,char parameter_char_a) { 
        // 생성자 (class명과 같은 멤버함수)
        // 함수에 사용하는 매개변수가 parameter
        test_value_int = parameter_int_a;
        this->test_value_char = parameter_char_a;
    }
    //생성자는 자동호출, 멤버함수는 수동호출

    void set_values_method(int param_int, char param_char) {
        this->test_value_int = param_int;
        this->test_value_char = param_char;
    }


    void print_values_method();
};

//클래스 외부에 멤버함수 선언
void Test_class::print_values_method() { // get역할
    cout << "parameter 1 : "
        << test_value_int
        << "\nparameter 2 : "
        << test_value_char
        << endl;
}



void main() {
    Test_class test_class_a = { 1, 'a'}; // test_class_a.Test_class(1,'a');
    // 호출하는 함수 내부에 작성되는 것이 argument
    test_class_a.print_values_method();

    test_class_a.set_values_method(2, 'b');
    /*
    * 작성일자 : 23.12.21
    * 이슈사항 : 오류가 나서 알았다, 문자를 쓸때, ""안에 있으면 const로 인식한다.
    * 해결방안 : test_class_a.set_values_method(2, "b"); int, const char
    *          -> test_class_a.set_values_method(2, 'b'); int, char
    */ 
    test_class_a.print_values_method();

    Test_class test_class_b;
    test_class_b.print_values_method();

}
  1. 소멸자
    • 객체 정의시 생성자를 통해 메모리를 할당 받을 시 heap 영역에 존재하여 프로그램이 종료되어도 메모리에 남음
    • 일반 변수와 같이 선언시 블록이 끝날 때 자동 소멸 (동적 할당된 변수를 제거하기 위함)
using namespace std;

class Test_class {
private:
	int int_a;
	char* char_ptr_a;

public:
	Test_class(int param_int, const char *param_char_ptr) {
		cout << "생성자 호출 : " << this << endl;;
		this->int_a = param_int;
		this->char_ptr_a = new char[strlen(param_char_ptr) + 1]; 
		// argument를 parameter로 받아 strlen+1로 동적할당
	}

	Test_class() : int_a(10),char_ptr_a(new char[10]) {
		cout << "생성자 호출 : " << this << endl;;
	}

	~Test_class() {
		delete []char_ptr_a;
		cout << "소멸자 호출 : " << this << endl;
	}
};
void main() {
	Test_class class_a(10 ,"TEST"); // 인수가 존재하는 생성자
	Test_class class_b; // 콜론을 이용한 생성자, 생성자 오버로딩 이용

	//class_a.~Test_class(); 
	//class_b.~Test_class();
	/*
	* 작성일자 : 23.12.21
	* 이슈사항 : _CrtIsValidHeapPointer(block)
	*			 애초에 자동실행되는 소멸자를 호출 시 이미 해제된 자원을 중복하여
				 해제를 시도하여 중단점 명령 문제 발생
	* 해결방안 : 소멸자는 자동호출된다. 
	* 참고사항 : https://gerrk.tistory.com/52
	*/
}