연산자 오버로딩, 정적 멤버
연산자 오버로딩
말 그대로 연산자를 오버로딩 하는 것이다.
형식은 다음과 같다.
Point operator+(const Point &ref)
{
Point pos(xpos+ref.xpos, ypos+ref.ypos);
return pos;
}
연산자 오버로딩은 멤버 함수나 전역 함수로 만들 수 있다.
Point operator+(const Point& ref1, const Point& ref2)
{
Point ref (ref1.x + ref2.x, ref1.y+ref2.y );
return ref;
}
멤버 함수와 전역함수로 동시에 오버로딩이 되어 있으면 멤버함수의 우선순위가 더 높다.
만약 private인 멤버변수에 전역 함수로 접근하고 싶다면, freind 선언이 필요하다.
class Point
{
...
friend Point operator+(const Point& ref1, const Point& ref2); // 변수 이름을 빼도 동작한다.
};
Point operator+(const Point& ref1, const Point& ref2)
{
Point ref (ref1.x + ref2.x, ref1.y+ref2.y );
return ref;
}
대입 연산자
- 디폴트 대입 연산자는 얕은 복사로 진행된다.
- 디폴트 대입 연산자는 자기자신의 참조 타입을 인자로 받는다.
- 깊은 복사가 필요하면 직접 정의해야 한다.
복사 생성자는 객체를 새로 생성할 때 호출된다.
상속 구조에서 부모 클래스의 대입연산자는 필요 없는지 살펴야 한다.
멤버 이니셜라이저로 멤버 객체를 초기화 할때 복사생성자가 호출된다.
정의된 부분으로 대입연산 한다면 생성자와 대입연산자가 호출된다.
단항 연산자
전위 증가(감소) Point& operator++()
- b=++(++a) 형태가 가능하여 반환 타입을 참조자로 한다.
후위 증가(감소) const Point operator++(int)
- b=(a++) 값을 대입 후 증가 한다.
- 참조자를 반환해서는 안 된다. 함수 내부의 객체를 전달 하기 때문에 함수가 끝나면 사라진다. 따라서 (a++) 형태를 참조자에 인자로 전달하고 싶으면 아래와 같이 const로 매개변수를 설정해야 한다.
Point operator=(const Point& ref)
(대입 연산자에서의 예) - (a++)++ 형태는 c++에서 불가능 하다.
c++에서 기본 타입의 후위 연산인 경우 const 형태를 반환한다.
오버로딩이 불가능한 연산자 | 멤버 함수로 오버로딩 해야하는 연산자 |
---|---|
. | = |
.* | ( ) |
:: | [ ] |
?: | -> |
sizeof | |
typeid | |
형 변환 연산자 4 |
정적 멤버
전역 변수에 선언된 static
- 선언된 파일 내에서만 참조를 허용하겠다는 의미
함수 내에 선언된 static
- 한 번만 초기화, 함수를 빠져나가도 소멸되지 않는다.
정적 멤버 변수
- 멤버 변수에 static을 사용하여 모든 객체에서 같은 값으로 사용한다.
- 클래스당 하나만 생성, 데이터 영역에 할당(객체 내에 존재 하지 않는다.)
정적 멤버 함수
- 선언된 클래스의 모든 객체가 공유한다.
- 객체의 멤버로 존재하는 것이 아니다. (this 사용 불가)
- 멤버 함수에 static을 사용하면 객체를 생성하지 않아도 사용할 수 있다.
- private 멤버에 접근 불가능.
- static 멤버는 가능하다.
Author And Source
이 문제에 관하여(연산자 오버로딩, 정적 멤버), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@oak_cassia/연산자-오버로딩-정적-멤버저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)