연산자 오버로딩, 정적 멤버

Oak_Cassia·2021년 11월 13일
0

연산자 오버로딩

말 그대로 연산자를 오버로딩 하는 것이다.
형식은 다음과 같다.

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 멤버는 가능하다.
profile
rust로 뭐할까

0개의 댓글