복사 생성자

복사 생성자에는 얕은 복사와 깊은 복사가 있다.

기본적으로 복사하기위해서는 초기화 리스트에 값을 전달시켜서 복사를 한다.

=>이때의 문제점은 포인터가 있는 경우에 같은 주소값을 공유한다는 점이다.

같은 주소값을 공유한다면?? 같은 힙 메모리의 데이터를 공유할 것이고 함수에서 나가며 소멸자가 데이터를 지운다.

그러면 같은 주소값이 가리키던 데이터는 사라지게 된다.

그러면 남아있는 주소값은 빈 데이터를 가리키는 형태가 되어버린다.(이것이 얕은 복사)

이 문제를 해결하기 위해 깊은 복사를 하는 것이다.

깊은 복사는 복사 생성자 내부에 주소값같은 것을 새로 생성해서 따로 구현을 하는 것이다.

이렇게하면 복사된 주소와 기존의 주소가 같은 공간을 가리키는 경우가 사라질 것이고 위의 문제는 해결될것이다.

사용법:

ex)

Example::Example(const Example& ex);

 

연산자는 단항연산자, 이항연산자, 기타 연산자 등 종류가 많다

C++에서는 이러한 연산자를 오버로딩할수있다.

Vector sum = v1 + v2;

Vector sum = v1.operator+(v2); //위 아래는 동일한 코드이다.

 

std::cout<<number;

std::cout.operator<<(number); //또한, 위 아래는 동일한 코드이다.

두 방식은 멤버 함수를 이용한 연산자 오버로딩이며, 멤버 함수를 이용해서만 오버로딩 가능한 연산자는 =,(),[],->등이다.

 

사용법

ex)

Vector operator+(const Vector& rhs) const;

 

friend 키워드??

다른 클래스, 함수가 나의 private, protected 멤버에 접근이 가능하게 허용

사용법 ex)

friend class Y; //클래스에 사용할수도 있다.

friend void foo(X& x); //함수에 사용할수도 있다

=>다만, friend 키워드는 oop특성의 캡슐화를 해침(특수한 경우에만 사용)

 

전역함수를 이용한 연산자 오버로딩은 friend를 사용

cout<<vector(10,20)까지는 호출이되지만 cout<<vector(10,20)<<endl;에서는 컴파일 에러
위 이미지를 해결한 방식

return을 이용하여 std::osteram& 형식의 os를 반환 위 방식에서 문제였던 매개변수 1번 std::ostream& os를 채움

=>해결

'C++' 카테고리의 다른 글

C++ 8일차  (0) 2021.06.17
C++ 7일차  (0) 2021.06.13
C++ 5일차  (0) 2021.06.11
C++ 4일차  (0) 2021.06.09
C++ 3일차  (0) 2021.06.09

+ Recent posts