수업/C++

연산자다중정의- 이동대입연산자 , std::move, 형변환연산자

MDanderson 2024. 11. 26. 23:12

대입연산자의 다중정의

a=b; 에서 a가 자기자신객체 , b가 매개변수로 전달됨.

데이터의 길이를 나타내는 항목이있고 

 

깊은복사를 해야함

 

이동대입 연산자

좌측피연산자에 대입할 우측 피연산자가 rvalue일때 사용됨 ( 대입후 우측 피연산자의 내용이 더 이상 필요없는 상황)

우측 피연산자의 내용을 좌측피연산자로 이동하여 불필요한 복사를 하지 않아도 되게 함

&&를 넣어서 rvalue참조를 받게 함

const는 없다 우측피연산자의 내용이 바뀌기 때문.

대입연산자에의해 v1가 깊은복사로 v3로복사됨

 

이동대입 연산자가  발동되면 아래와되고  이후 ,임시객체의 소멸자가 작동되서 v1.add(v2)는 없어짐

 

 

std::move 함수의 활용

 

swap함수를 구현할때. 이동 대입 연산자를 이용하면 효율적으로 구현가능

인수로 전달되는 객체의 rvalue참조를 반환한다.

 

 

아래와같이 lvalue를 받아서 move함수로 내부에서  rvalue참조로 바꿔줘서 이동이 이룯어짐


[ ] 연산자의 다중정의

 

a[5]  에서 a가 첫번째 피연산자  , 5는 첨자로 두번째 피연산자가 된다.

SafeIntArray는 내가 만든 클래스이고

좌측 피연산자는 *this이고  두번째 첨자는 i로 전달될것.

이 연산자에 의해 지정되는 데이터공간의 참조를 반환하게끔. int&로 한다

 

 


 

이것은 그냥 값을 리턴하는거니까 int라고 적는다.

 

 

 

friend 복습

 

자료형의 변환

MyString&& mstr (이동 대입 연산자)이 필요한가?

MyString&& mstr은 **Rvalue(임시 객체)**를 처리하기 위해 필요합니다. 묵시적 형 변환 과정에서 임시 객체가 생성될 수 있으므로, 이동 대입 연산자가 이를 최적화된 방식으로 처리합니다.

묵시적 형 변환이 이동 대입 연산자와 관련 있는 경우:

  1. "Programming" 리터럴이 const char*로 시작합니다.
  2. MyString 생성자를 통해 "Programming"이 임시 MyString 객체로 변환됩니다.
  3. 이 임시 객체는 이후 **대입 연산자(=)**로 처리됩니다:
    • 복사 대입 연산자가 호출되면, 기존 객체에 데이터를 복사합니다.
    • 이동 대입 연산자가 호출되면, 기존 객체에 데이터를 이동(소유권 이전)하여 복사의 오버헤드를 줄입니다.

이동 대입 연산자와 복사 대입 연산자의 차이:

  • 복사 대입 연산자는 데이터를 복사합니다. 원본 객체는 그대로 유지됩니다.
  • 이동 대입 연산자는 데이터를 이동하여 원본 객체는 비워지고, 임시 객체의 리소스를 재사용합니다.

형변환 연산자를 정의하는 위치

 

 

char*스타일로 바꿈.  형변환하겠다는 의미

 

 

묵시적형변환이 이루어지지 않게 하려면?

 

반드시 명시적으로 지정해줘야함

 

2번은 static_cast로 MyString으로 형변환하라는 뜻

 

 

class MyString {

     int len, bufSize;

     char* buf;

public:

     ……

     bool operator >= (const MyString& mstr) const

        { return             ㈀           ; }

};

위 지문은 MyString 클래스의 관계연산자 >=를 다중정의한 것이다. ㈀에 넣을 적절한 문장은?

 

 

정답 : strcmp(buf, mstr.buf) >= 0
strcmp(str1, str2)는 str1과 str2가 같으면 0, str1이 str2보다 사전순서로 앞서면 음, 그렇지 않으면 양의 값을 반환한다
정답 : strcmp(buf, mstr.buf) >= 0
strcmp(str1, str2)는 str1과 str2가 같으면 0, str1이 str2보다 사전순서로 앞서면 음, 그렇지 않으면 양의 값을 반환한다

 

 

지문

class Pencils {

     int dozen;         // 타

     int np;              // 낱개

public:

     ……

              ㈀         

       { return dozen * 12 + np; }

};

Q4
위 지문의 클래스에서 Pencils 객체를 int형인 연필 자루 수로 형 변환하는 연산자를 선언하기 위해 ㈀에 넣을 내용은?
1
int ( )
2
operator int( ) const
3
int operator( ) const
4
operator int(Pencils p) const
정답입니다.
정답 : 2
변환하고자 하는 자료형을 연산자로 선언하면 형 변환 연산자가 만들어진다.