'Programming/C, C++'에 해당되는 글 9건

  1. 2012.01.09 20120109_복사생성자, const
※잡내용
int num=20; // 일반적인 초기화
int num(20); // C++에서 허용하는 초기화


복사생성자
여기 클래스가 정의되어있다.
class ClassA
{
private:
 int num1;
 int num2;
public:
 불라불라...
}

다음 두 줄의 코드는 ClassA 클래스의 객체 A2에 객체 A1를 복사하는 것이다.
ClassA A2 = A1;
또는
ClassA A2(A1);

이런 복사를 할 때엔 보통의 생성자가 아닌 복사생성자를 호출하고,
특별하게 복사생성자를 정의하지 않을 경우 자동으로 디폴트복사생성자를 호출한다.
ClassA(const ClassA& copy) : num1(copy.num1), num2(copy.num2) {}


● 깊은복사, 얕은복사
ClassA에 문자열 저장을 위한 멤버변수를 선언했다.
char * c;
그리고 객체A2를 만들어 A1을 복사하였다.
ClassA A2 = A1;
복사생성자는 따로 만들지 않았기 때문에 디폴트복사생성자를 호출하여 단순 복사를 하게 된다. (얕은복사)
ClassA(const ClassA& copy) : num1(copy.num1), num2(copy.num2), c(copy.c) { }

문자열 복사를 자세히 보고 생각을 해 보자........... 저거 저대로 하면 큰일난다.
그대로 실행하면 문자열이 복사되는 게 아니라 문자열 주소가 복사된다.
결국 A1.c == A2.c 가 되버릴 뿐만 아니라
소멸자를 호출할 때 호출되는 소멸자는 두 개지만 먼저 호출되는 소멸자가 문자열을 지워버리면 두번째 소멸자는 소멸시킬 게 없다
-> 포★풍ERROR
그래서 복사생성자를 이쁘장하게 따로 선언해준다. 딱히 어려울 것도 없다. 그리고 이러한 복사의 형태를 깊은복사라고 한다.
ClassA(const ClassA& copy) : num1(copy.num1), num2(copy.num2)
{
  c=new char[strlen(copy.c)+1];
  strcpy(c, copy.c);
}


const
const - 상수...
너무 쓰이는 데가 많아서 헷갈려 헉헉ㅠㅠ



const int num = 10;
- 변수의 상수화

int *const p = #
- p가 가리키는 주소를 변경할 수 없음.

const int *p = #
- p를 통해 자기가 가리키는 값을 변경할 수 없음.

const int *const p;
- 주소, 값 둘 다 변경 불가.

const Class cla(20);
- 이 객체를 대상으로는 const 멤버함수만 호출이 가능하다.
   (객체의 const선언은 이 객체의 데이터 변경을 허용하지 않겠다는 의미를 가짐)







'Programming > C, C++' 카테고리의 다른 글

20111219_상속  (0) 2011.12.19
20111216  (0) 2011.12.16
20111215_구조체, 상속성  (0) 2011.12.15
20111212_C 기초부터 정리하긔  (0) 2011.12.12
20111212_정적멤버변수/함수, 상수멤버  (0) 2011.12.12
Posted by HUEJI
: