- 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;
}
- 생성자
- 객체 생성 시점 자동 호출 멤버함수
- 멤버변수 초기화 (생성과 동시에 자동실행, 추가 실행해선 안됨)
- 함수명이 클래스명과 동일함
- 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();
}
- 소멸자
- 객체 정의시 생성자를 통해 메모리를 할당 받을 시 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
*/
}
'C++ > 기초' 카테고리의 다른 글
vector array를 for_each가 아닌 for문으로 element 확인 (0) | 2023.12.31 |
---|---|
[C++] 클래스(Class), 객체 지향 프로그램(Object Oriented Programming) (1) | 2023.12.21 |
[C++] 문자열 (1) | 2023.12.19 |
[C++] 동적할당 (1) | 2023.12.18 |
[C++] 래퍼런스(Reference) 변수, 포인터(Pointer) 변수 (0) | 2023.12.15 |