대입 연산자와 연산자 오버로딩 : 연산자의 기능을 사용자가 임의로 재정의할 수 있다. 클래스 내부에 method로써 정의한다. 연산자 사용을 금지하는 목적으로 private에 연산자 오버로딩을 하는 경우도 있다. a - b에서 -가 오버로딩 되어있다면, a - b를 a.operator-(b) 로 바꾸어 주는 과정을 컴파일러가 자동으로 해준다. -a의 경우, a.operator-() 의 방식으로 할 수 있다. ++a 나 = 연산자에 대해서는 참조형으로 parameter을 받고 참조형으로 return해 주는 것이 쓸 데 없는 값복사가 일어나지 않는다. ++a 의 경우에는 참조형을 return, a++ 의 경우에는 객체 자체를 return. 시점의 문제. a + 3 이라면 다른 type도 예측이 가능하다. 하지만, 3 + a라면 primitive type이라 다른 type 간의 연산 시 type 예측이 불가능하다. primitive type에 대한 operator의 경우에는 class 내부의 Method가 아니라 외부에서 선언하며, parameter로써 연산에 필요한 피연산자를 받는다. Ex) A operator + (int ,A); // 이는 class A의 멤버가 아님. 위처럼 오버로딩한 연산자는 class A의 private 변수에 접근 할 필요가 있다. 이 때, class A에서 friend 선언을 통해 접근을 허가한다. Ex) class A { int val; public : A operator-(A rhs) { A res; res.val = val - rhs.val; return res; } } 명시적으로 삭제 : Ex) class A { A() = delete; } ==> 이 클래스는 객체를 만들 수 없다. 기본 생성자가 아닌 다른 생성자만 정의한 경우에도 delete를 통해 기본 생성자를 삭제해주면, Linker에서 생기는 에러를 컴파일 타임에서 생기도록 당겨올 수 있다. 생성자, 복사 생성자 뿐 아니라, 함수와 연산자 역시도 삭제(금지)할 수 있다. 원하지 않는 경우 확실히 금지 시켜놓는 것이 좋다.