2017-12-18 5 views
0

(할당 연산자의 구현) 스왑은 다음과 같습니다사용 : 나는 어떤 장소에서 클래스 행렬의 assignemt 연산자의 구현을 본

class Matrix 
{ 
private: 

    int rows; 
    int cols; 
    int **mat; 

public: 

    Matrix& operator=(const Matrix& m) 
     { 
      if (this != &m) 
      { 
       Matrix temp(m); 
       std::swap(temp.rows, rows); 
       std::swap(temp.cols, cols); 
       std::swap(temp.mat, mat); 
      } 
      return *this; 
     } 
} 

을 지금, 나는가 스왑 기능을 사용한다고 가정 그 문제, 글을 쓰지 않고 그것을 사용하는 다른 방법은 무엇입니까 std:swap? 이 경우 두 매트릭스의 스왑을 구현하는 친구 기능을 구축한다고 생각합니까?

+4

이것은 올바르게 보이지 않습니다. 참조 및 스왑으로 전달하지 않는 [복사 및 스왑] (https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)이어야합니다. – NathanOliver

+2

@NathanOliver : @NathanOliver : 빠른 견해에서 기능적으로 동일해야하며 자체 할당을 확인한 후에 만 ​​사본을 수행합니다 (정확성은 필요하지 않지만 작은 추가 최적화로 보일 수도 있고 공통점의 비관적 인 것으로 볼 수도 있음). 케이스). 그래도 정당한 이유가없는 한 더 많은 코드 (4 줄과 2 개의 토큰)가 필요합니다. –

+1

@MatteoItalia 기능상으로 동일하지 않습니다. 복사 및 스왑에서 임시 복사본의 헛소리를 훔칩니다. 참조로 전달하면 객체 자체의 내장을 훔쳐 내며이 경우 실제로는 'const'이므로 실제로 작동하지 않습니다. – NathanOliver

답변

0

그런데 스왑 기능을 사용하고 싶다면 std:swap을 쓰지 않고 사용할 수있는 대체 방법은 무엇입니까? 이 경우 두 매트릭스의 스왑을 구현하는 친구 기능을 구축한다고 생각합니까?

두 개의 Matrix 개체를 교환해야합니다. operator= 기능에서 수행하든 다른 기능에서 수행하든 상관 없습니다.

실제로 두 개의 Matrix 개체를 바꿔서 operator= 함수의 구현을 사용하는 것이 좋습니다. 당신은 그것에 대한 다양한 옵션이 있습니다.

  1. 비회원 friend 기능으로 만듭니다.
  2. 회원 기능을 static으로 지정하십시오.
  3. static 멤버 함수가 아닌 것으로 설정합니다.

나는 아마도 static 멤버 함수를 선택 하겠지만 다른 두 가지 중 하나를 사용하는 데는 단점이 보이지 않습니다.

한 가지주의해야 할 점은 std::swap을 사용하면 해당 기능의 Matrix 개체의 멤버 변수를 바꿀 수 있습니다. 그게 너에게 관심사 인 것처럼 내게 다가왔다.

관련 문제