프렌드와 연산자 중복

📒 프렌드 함수

멤버 함수가 아니지만 클래스의 내부 데이터에 접근할 수 있음.

class myClass{
	friend void sub();  // 요게 friend
};

void sub()
{
	~~~
}

원형은 내부에 정의되지만 본체는 외부에서 따로 정의된다*

프렌드 클래스

마찬가지로 클래스 내부 데이터 접근 가능

class Employee{
	friend class Manager;
};













📒 연산자 중복

✔ 연산자 중복의 형식

반환형 operator연산자(매개변수 목록)
{
   ...
 }



연산자 중복의 구현 방법

1. 멤버 함수

2. 비멤버 함수(friend)



연산자를 멤버, 비멤버 함수로 정의 해보자.



1. 산술연산

  • 일반적으로 비멤버함수로 정의

산술연산의 멤버 함수 구현

class myClass{
public:
    int a;
    myClass(int num): a(num){};
	myClass operator+(const myClass& cls);
}

myClass operator+(const myClass& cls){
	myClass obj(a + cls.a);
    return obj;
}

산술연산의 비멤버 함수 구현

class myClass{
	publid:
    int a;
    myClass(int num): a(num){};
	friend myClass operator+(const myClass& cls1, const myClass& cls2);
}

myClass operator+(const myClass& cls1, const myClass& cls1){
	myClass obj(cls1.a + cls2.a);
    return obj;
}










2. 할당연산(=)

  • 멤버 함수로 정의
    할당연산자의 매개변수가 일반적으론 객체에 대한 레퍼런스 상수 이지만,
    코드에 따라서 그냥 객체이거나, 상수가 아닌 레퍼런스일 수 있기때문.


할당연산의 멤버 함수 구현

class myClass{
	publid:
    int a;
    myClass(int num): a(num){};
    myClass operator=(const myClass& cls);
}

myClass& operator=(const myClass& cls){
	this->a = cls.a;
    return *this;
}
  • 컴파일러가 매개 변수를 변환할 수 있으려면 할당 연산자는 멤버 함수이어야한다.
  • 할당 연산자는 레퍼런스를 반환한다. 할당 연산자는 연속하여 적용될 수 있기 때문이다.
    ex) a1 = a2 = a3;











3. 관계연산(==, !=)

  • 비멤버함수로 정의
class myClass{
	publid:
    int a;
    myClass(int num): a(num){};
	friend bool operator==(const myClass& cls1, const myClass& cls2);
}

bool operator==(const myClass& cls1, const myClass& cls1){
	return cls1.x == cls2.x
}









4. <<, >> 연산

  • 다시 스트림 객체를 반환하여야한다.
  • 현재 객체의 const 객체를 받아야한다.

반드시 비멤버 함수로 작성
멤버함수로 정의하면 << 왼쪽에 객체가 와야하는데 그럼 틀림.

class myClass{
	publid:
    int a;
    myClass(int num): a(num){};
	friend ostream& operator<<(ostream os,  const myClass& cls);
    friend istream& operator<<(istream is,  const myClass& cls);
}

ostream& operator<<(ostream os,  const myClass& cls){
	os << cls.x << endl;
    return os;
}

istream& operator<<(istream is,  const myClass& cls){
	is >> cls.x;
    return is;
}

타입 변환

  1. 변환 생성자 - 매개변수가 하나인 생성자를 사용해서 다른 타입을 우리의 클래스 타입으로 변경

  2. 변환 연산자 - 클래스 타입을 다른 타입으로 자동 변환

변환 생성자

class book{
public:
int isbn;
string title;

book(){
	isbn = 0;
    string = "unknown";
}

book(int isbn){
    this->isbn = isbn;
    this->title  = "unknown";

}

int main(
book b1 = 9123232;
}

📒 변환 연산자

class book{
	public:
    int isbn;
    string title;

	book(){
    	isbn = 0;
        string = "unknown";
    }
    book(int isbn){              ## 변환 생성자
    	this->isbn = isbn;
    	this->title  = "unknown";
    }
    operator int() const{        ## 변환 연산자
    	return isbn;
     }
}


int main(
	book b1 = 91823213;
    int isbn = b1;
   }

좋은 웹페이지 즐겨찾기