연산자 오버로딩 추가내용
class MyInt
{
public:
int operator[](const int& _Other)
{
return Value;
}
int operator()(int Value0, int Value2)
{
Value = Value0 / Value2;
return Value;
}
}
int main()
{
MyInt NewMyInt = MyInt();
NewMyInt[10];
NewMyInt(10, 20);
}
이런식으로 () []와 같은 연산자도 연산자 오버로딩을 통해 정의해서 사용할 수 있다.
unordered_map과 같은 자료구조에 arr[string]같은 형태가 가능한 것도 이런 연산자 오버로딩을 통한 것.
형변환 연산자 오버로딩
class MyInt
{
public:
operator int()
{
return Value;
}
operator bool()
{
return Value;
}
private:
int Value = 0;
}
int main()
{
int TestValue = 20;
MyInt NewMyInt = MyInt;
NewMyInt = TestValue;
}
원래대로라면 int와 MyInt 타입 간의 = 연산은 구현되어 있지 않기 때문에 오류가 발생해야 하지만
형변환 오버로딩을 정의해주면 위처럼 다른 타입에 대해 형변환 연산자가 알아서
int와 int간의 연산으로 변환되어 연산이 가능해지게 된다.
namespace
내부 식별자(형식, 함수, 변수 등의 이름)에 범위를 제공하는 선언적 영역
다시 말하자면 어떤 스코프 범위에 대해 별명을 붙이는 걸로 볼 수 있다.
namespace A
{
// ::A::Item
class Item
{
};
}
namespace B
{
// ::B::Item
class Item
{
};
}
이런식으로 같은 이름의 Item class가 있지만 각각 A와 B 네임스페이스 내부에 있으므로 서로 다르게 구별된다.
std namespace
c++자체에서 지원하는 표준들이 모두 포함되어 있는 namespace를 말한다.
using namespace std;
이걸 쓰기보다는 std::를 꼬박꼬박 붙여주는 습관을 가지자.
알고리즘 문제 풀이나 코딩 테스트의 경우에는 빨리 타이핑하고 빨리 푸는게 중요하기 때문에 어쩔 수 없이 쓰는편이다.
c++에서 출력에 사용하는 cout또한 std namespace에 포함된 ostream 타입의 전역객체이다.
전역 연산자
클래스 내부의 연산자 오버로딩은 좌항에는 자기자신 우항에는 상대를 필요로 한다.
전역 연산자는 자기자신이라고 할만한 게 없기 대문에 인자를 2개 필요로 한다.
왜 이게 필요한지?
내가 만든 사용자 정의 자료형이 우항에 와야할 상황이 오면 만든다.
아래와같이 int와 MyInt의 -연산을 정의하고 싶은경우
int operator-(const int Value, MyInt _NewInt)
{
return Value - _NewInt.Value;
}
이런식으로 구현할 수 있다.
파일 나누기
코드가 너무 길어지면 보기도 힘들고 유지보수도 힘들다.
그래서 코드를 적절하게 나눠야 할 필요성이 있다.
헤더에는 선언만 놓아야 한다. 그런데 template이 들어가는 경우에는 좀 다르다.
#pragma once
#include를 할 때
A라는 파일을 B에서 include 했는데
C에서 A와 B를 include했다고 치자 그러면
C에는 A가 2번 include되는 것과 같다.
이런 중복include되는 경우를 방지해주는 전처리문이 #pragma once다.
extern
외부에 대한 링크가 있음을 명시하는 키워드
'개인 공부 및 프로젝트 > 국비과정' 카테고리의 다른 글
20241004 - 소멸자, 함수포인터, virtual (0) | 2024.10.18 |
---|---|
20240930 - 선언과 구현, 파일 입출력 (3) | 2024.10.07 |
20240926 - 클래스 상속 연산자 오버로딩 (1) | 2024.09.30 |
20240925 - 프로그래밍 패러다임, 클래스 (11) | 2024.09.30 |
20240924 - MyPrintf, 객체지향 패러다임 (0) | 2024.09.30 |