Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
| 31 |
Tags
- TPS
- 자료구조
- unreal
- 얌얌코딩
- 코딩
- 커스텀로그
- c++자료구조
- permutation
- 프로그래밍
- 재귀함수
- 내가해냄
- fstring
- 구조체포인터
- C++
- UE5
- 코딩테스트
- 게임개발
- 백준
- 탐색기법
- 연산자오버로딩
- 개발자
- 언리얼
- 게임프로그래밍
- 개발
- dfs
- 링크드리스트
- 언리얼로그
- 미라클모닝
- 오늘의에러
- 구조체
Archives
- Today
- Total
All is well
[YYBASIC0101/얌얌코딩] 클래스와 구조체, 멤버함수의 동작원리 본문
클래스와 구조체의 차이
- 클래스와 구조체의 큰 차이점은 default 접근 지정자에서 나타납니다.
- struct : `public`
- class : `private`
클래스에서는 멤버 함수 선언이 가능하다
- 클래스에서는 멤버 함수 선언이 가능합니다.
- 멤버 함수의 매개변수가 없는 경우, 객체의 주소가 암묵적으로 `this` 포인터를 통해 전달됩니다.
- 이때 `this` 포인터는 함수가 실행되는 중에 객체 주소가 변하면 안되므로 `const` 키워드가 붙습니다.
- `CLASSNAME* const this`
- 이때 `this` 포인터는 함수가 실행되는 중에 객체 주소가 변하면 안되므로 `const` 키워드가 붙습니다.
멤버 함수 뒤에 `const`를 붙이면 해당 함수는 읽기 전용 함수가 된다
- `const` 키워드가 붙은 함수의 경우, 멤버 변수의 값을 변경할 수 없습니다.
- 멤버 함수 내에서 멤버 변수의 값을 변경하려는 경우 컴파일 에러가 발생합니다.
- 이때 `this` 포인터는 주소는 물론 전달되는 값도 변하면 안되기 때문에 앞뒤로 const 키워드가 붙습니다.
- `const CLASSNAME* const this`
#include <iostream>
using namespace std;
// 사용자 정의 자료형 - struct
struct People
{
// public:
int age;
int height;
char name[256];
};
// 사용자 정의 자료형 - class
class CPeople
{
// 접근 제한 지정자
public:
// 멤버 함수
void AddAge(/* CPeople* const this */)
{
/* (*this).*/age += 10;
}
// 멤버 함수 뒤에 const : 멤버 변수의 값을 변경할 수 없음 - 읽기 전용 함수
void AddAge2(/* const CPeople* const this */) const
{
// age += 15; // ERROR
}
void AddHeight()
{
height += 50;
}
//private:
char name[256];
int age;
int height;
};
// 구조체와 클래스의 차이
// struct : default 접근 제한 지정자가 public
// class : default 접근 제한 지정자가 private
// 접근 제한 지정자를 사용하는 이유 : 중요한 데이터 보호 / 프로그래밍 중간에 데이터가 바뀌는 것을 방지
// 객체지향 5대 원칙 : SOLID
// ★ this pointer는 중간에 값이 변하면 안돼서 const로 정의됨
// P1에 Deep Copy가 일어남
// p1을 이용하여 값을 변경해도 원본 데이터는 변하지 않음
void AddAge(People p1)
{
p1.age += 10;
}
// P1에 Shallow Copy가 일어남
// p1을 이용하여 값을 변경하면 원본 데이터가 변함
void AddAge(People* p1)
{
// (*p1).age += 10;
p1->age += 10;
}
void AddHeight(People* p1)
{
// (*p1).height += 50;
p1->height += 50;
}
int main()
{
// struct
People A;
A.age = 10;
A.height = 120;
// 선언만 된 char형 배열은 초기화 시 strcpy 사용
//strcpy(&A.name[0], "Doyun");
strcpy(A.name, "Doyun");
AddAge(&A);
AddHeight(&A);
// class
CPeople B;
B.age = 10;
B.height = 120;
strcpy(B.name, "Doyun");
B.AddAge(); // 암묵적으로 () 안에 this 포인터를 통해 B의 주소를 전달함
B.AddHeight();
// const 키워드
const int num = 100;
int num2 = 100;
// const가 뒤에 붙는 경우 : 초기화된 주소를 바꿀 수 없다
int* const p = &num2;
// p = &num2; // ERROR
// const가 앞에 붙는 경우 : 해당 포인터 변수가 가리키는 값을 바꿀 수 없다
const int* pp = &num2;
// *pp = 300; // ERROR
// const가 앞, 뒤로 붙는 경우 : 초기화된 주소, 해당 포인터 변수가 가리키는 값도 변경할 수 없다
const int* const ppp = &num2;
return 0;
}
'C++ > YYBASIC' 카테고리의 다른 글
| [YYBASIC0201/얌얌코딩] 기본기 복습 (0) | 2025.02.04 |
|---|---|
| [YYBASIC0105/얌얌코딩] 간단한 버전의 std::string 클래스 만들어보기 (0) | 2025.02.03 |
| [YYBASIC0104/얌얌코딩] 연산자 오버로딩 기본 (0) | 2025.02.03 |
| [YYBASIC0103/얌얌코딩] 생성자, 소멸자 (0) | 2025.02.02 |
| [YYBASIC0102/얌얌코딩] 멀티패러다임 언어 (2) | 2025.02.02 |