this useful site 단순히 컴파일러 제공 복사 생성자의 기본 동작은 모든 값입니다 복사. 이를 "얕은 복사본"이라고합니다.
참조에서 가리키는 개체 (여기 값)가 복사본에 새로 만들어 지도록 고유 한 생성자를 구현하면 더욱 정교한 동작을 얻을 수 있습니다.
foo::foo(std::istream& s) {
max = s.max;
val = new int;
*val = s->val;
listofVal = new size_t;
*listofVal = s->listofVal;
}
은 "딥 카피 (deep copy)"로 알려진 것을 달성하는 한 가지 방법입니다.
회원 중 한 명이 listofVal
이라고 말하면서 나는 그것이 가리키는 메모리 주소에 하나의 값을 저장하는 것 이외의 다른 것을하고 있다고 느낍니다.이 경우, 그 안에 들어있는 요소의 수에 대한 카운터를 알아야합니다. 나는 앞으로 당신이 max
라고 부르는 분야라고 가정 할 것입니다. 전체 목록을 복사하려면 복사 생성자는 할 필요가 :
foo::foo(std::istream& s) {
max = s.max;
val = new int;
*val = s->val;
listofVal = new size_t[max];
for (int i = 0; i < max; ++i)
listofVal[i] = s->listofVal[i];
}
라비는, 그래, 복사 생성자는 다른 두 전에 구현 될 수있는 구조의하고 "세 가지의 규칙을"파괴에도 불구하고 증거입니다 . 다음은 대입 연산자입니다.
은 object1 = object2;
할당에 적합합니다. 필자는 복사 생성자 접근 방식을 선호합니다.
방법은 클래스가 소멸자를 필요로하지만, 명시 적으로 요청하지 않은 것처럼 내가 년후 무엇을 대답하고 싶지 않았다 물론
class foo {
///...///As before
foo &operator=(const foo& matrix);
};
같이해야하므로 개인 데이터에 액세스 할 수있는 구성원이 될 필요가 '물었다.
당신이 고려해 볼 수 있습니다 강력한 할당에 대한 LHS 이미 데이터를 포함 할 수 복사 및 스왑 관용구에 대한 링크,에 이어 :
foo& foo::operator=(const foo& matrix) {
if (this != matrix) {
val = new int;
*val = matrix->val;
size_t* newArray = new size_t[max];
int newMax = matrix.max;
std::copy(matrix.listofVal, matrix.listofVal + max, newArray);
if (listofVal) delete listofVal;
listofVal = newArray;
max = newMax;
}
}
내가 힙에 로컬 객체를 할당하는 발생할 수 있음을 추가 할 수
메모리 누수 (메소드가 삭제를 담당하는 객체에 할당되기 전에 메소드가 중단되는 경우), 클래스 무결성을 유지하기에 충분할 때만이 완전히 다른 수준의 parannoia입니다.
이것은 숙제와 같습니다. 당신은 이미 무엇을 시도 했습니까? –
@sasha'private' 변수를'mutable'으로 만들려고했지만 꽤 추한 것 같습니다. – SNpn
SNpn : 오버로드 된 연산자는'foo' 클래스의 멤버이므로 private 멤버 데이터에 액세스 할 수 있습니다. – razlebe