프렌드와 연산자 중복
📒 프렌드 함수
멤버 함수가 아니지만 클래스의 내부 데이터에 접근할 수 있음.
class myClass{
friend void sub(); // 요게 friend
};
void sub()
{
~~~
}
멤버 함수가 아니지만 클래스의 내부 데이터에 접근할 수 있음.
class myClass{
friend void sub(); // 요게 friend
};
void sub()
{
~~~
}
원형은 내부에 정의되지만 본체는 외부에서 따로 정의된다*
프렌드 클래스
마찬가지로 클래스 내부 데이터 접근 가능
class Employee{
friend class Manager;
};
📒 연산자 중복
✔ 연산자 중복의 형식
반환형 operator연산자(매개변수 목록)
{
...
}
연산자 중복의 구현 방법
반환형 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;
}
타입 변환
-
변환 생성자 - 매개변수가 하나인 생성자를 사용해서 다른 타입을 우리의 클래스 타입으로 변경
-
변환 연산자 - 클래스 타입을 다른 타입으로 자동 변환
변환 생성자
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;
}
Author And Source
이 문제에 관하여(프렌드와 연산자 중복), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@lkm9709/프렌드와-연산자-중복
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
Author And Source
이 문제에 관하여(프렌드와 연산자 중복), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lkm9709/프렌드와-연산자-중복저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)