2010-05-08 3 views
2

가 그것을 필요, 정적 데이터 멤버가 클래스의 복사 생성자, 소멸자 및 연산자 =, 나는 컴파일러는 우리를 위해 하나를 구축 할 것을 읽을 수없는 포인터클래스 기본 운영

class myClass{ 
    int dm; 
public: 
    myClass(){ 
     dm = 1; 
    } 
    ~myClass(){ } // Is this line usefull ? 
    myClass(const myClass& myObj){ // and that operator? 
     this->dm = myObj.dm; 
    } 
    myClass& operator=(const myClass& myObj){ // and that one? 
     if(this != &myObj){ 
      this->dm = myObj.dm; 
     } 
     return *this; 
    } 
}; 

을 가지고 있으므로 그것을 (연산자를 업데이트해야하는 데이터 멤버를 추가 할 때)

+0

'int dm'은 정적 데이터 멤버가 아닙니다. 'static int dm'은 일종의 전역 변수가 될 것입니다. – Potatoswatter

답변

0

아니요. 컴파일러는 자동으로 모든 데이터 멤버를 자동으로 생성, 소멸 및 할당합니다. 즉, 수업이 모두 제공되면 수업을 작성할 필요가 없습니다. 어쨌든 회원 단위로 운영자를 작성하는 것이 더 나은 설계라고 생각합니다.

2

소멸자에 대해 아무 것도 생각할 수 없다면 기본 클래스의 가상 소멸자를 제외하고 소멸자를 정의 할 필요가 거의 없습니다. 그리고 소멸자가 필요 없다면, 복사 생성자와 대입 연산자를 정의 할 필요가 거의 없으며 그렇게하지 않아도됩니다. 잘못 입력하는 것이 쉽기 때문입니다.

0

컴파일러는 그 자체를 제공합니다. 기본적으로 복사 생성자/할당 연산자는 모든 멤버 (클래스가 파생 된 경우 객체의 기본 부분)를 복사/할당하고 소멸자는 아무 작업도 수행하지 않습니다 (모든 멤버 /베이스의 소멸자를 호출하지만, 자신이 제공 한 경우에도 변경됩니다. 즉, 사용자 정의 소멸자의 본문이 종료 된 후에 발생합니다.

그래서이 경우 완전히 필요하지 않습니다. 달성 할 수있는 것은 코드에 버그를 도입하는 것입니다 (예 : 다른 멤버를 추가하지만 복사 생성자를 업데이트하여 해당 멤버도 복사하는 것을 잊어 버림).


myClass& operator=(const myClass& myObj){ // and that one? 
    if(this != &myObj){ 
     this->dm = myObj.dm; 
    } 
    return *this; 
} 

은 당신이 가지고 독단적으로 "자기 할당 확인"을해야한다고 생각하지 않습니다. int 자체를 (심지어 간접적으로) 할당 할 때 나쁜 일이 발생합니까? 할당 연산자가 먼저 현재 보유한 자원을 파괴하고 오른쪽에있는 객체로부터 새로운 것을 생성하는 경우 자동 할당을 방지

int a = 10; 
int& ref = a; 
a = ref; 

에만 관련이 있습니다. 그렇다면 실제로 당신이 간접적으로 오른 손잡이를 파괴했다는 것을 알아내는 것이 재앙 일 것입니다.

하지만 그 경우에도 먼저 오른쪽면 사본을 만든 다음 왼쪽면의 내용을 파괴하는 것이 좋습니다.이 경우 자체 할당은 문제가되지 않습니다 (잠재적으로 비효율적 인 경우는 제외).). 이것을 구현하는 좋은 방법은 Google이 복사 및 스왑 숙어를 사용하는 것입니다.

+0

자기 지정이 문제를 일으키는 경우, 나는 그 사실을 단순히 문서화해야한다고 생각합니다. 결국, 얼마나 자주 자주 과제가 발생합니다. 그것이 처리되어야하는 경우, 나는 그것이 확실히 프로그래밍 오류이기 때문에 예외 (또는 주장)를 던져 버릴거야. –

+0

@Neil : 필자는 반드시 프로그래머가 잘못한 것은 아닙니다. 'sort' 나'random_shuffle'이 가끔씩 자신에게 할당하지 않는다는 것을 어떻게 확신 할 수 있습니까? – UncleBens