2024 - 01 - 18 C++ Grammar D+3
객체 초기화
* 클래스의 객체를 선언하였다고 안에 있는 지역변수까지 값이 할당된것은 아니기에 쓰레기 값을 가지고 있음. 따라서 객체를 할당하고 난다음 지역변수를 초기화시켜주어야함
생성자
* 객체를 초기화하는 특별한 함수
생성자의 호출
예)
암시적인 방법 : Position Here(30,10,'A');
명시적인 방법 : Position Here=Position(30,10,'A');
특징
* 함수 이름을 클래스 이름이랑 같게 선언하여야함
* 생성자도 함수의 일종이기때문에 오버로딩이 가능하여 디폴트 인수를 쓸수 있고, 인라인으로 선언할 수 있음
파괴자
* 객체나 메모리 또는 프로그램 등 컴퓨터안에서 움직이는 모든 것들은 항상 자신이 생성되기 전의 상태로 환경을 돌려놓아야하므로 객체가 소멸될때 컴파일러에 의해 자동으로 호출되는 함수
특징
* 클래스 이름 앞에 ~를 붙인 것으로 고정되어 있으며, 인수와 리턴값은 가지지 않는다.
* 생성자와 파괴자의 공통 특징
* 리턴값이 없음
* 반드시 public 액세스 속성을 가져야 한다. 만약 public 이 아닐시 객체 선언시 컴파일 에러로 처리됌
* friend도 static도 될 수 없다. 생성자, 파괴자는 둘 다 클래스 내부의 함수이므로 friend 지정이 없어도 멤버를 마음대로 액세스할 수 있다.
* 파괴자는 가상 함수로 정의될 수 있지만 생성자는 가상 함수로 정의될 수 없다.
* 둘다 디폴트 함수로 존재하긴하나, 아무런 동작을 하지않는다.
생성자의 종류
1. 디폴트 생성자
* 생성자안에 인수를 가지지 않으며 하나의 값으로만 초기화를 시켜주는 생성자 주로 모든 멤버를 0이나 -1 또는 NULL 이나 빈문자열로 초기화할때 쓰인다
* 디폴트 생성자가 정의되지않거나 없을시, 클래스 배열로 선언할수없다.
* 만약 생성자가 정의되있을시 배열 하나하나 마다 생성자를 일일이 호출해주어야함
예) public:
Position() {
x=0;
y=0;
ch=' ';
}
2. 복사 생성자
* 같은 클래스를 얕은 복사를 하여 값을 대입시킬때, 인자의 형식이 포인터로 되어있으면 복사대상인 클래스나 복사한 값을 받은 객체 할당이 해제 되었을 때, 다른 객체가 바라보고 있는 포인터의 주소가 할당해제되있으므로 값을 불러오지못함.
따라서 포인터형식의 인자를 받는 클래스의 객체를 복사할때는 직접접근하여 값을 대입해주는 깊은 복사(& 대입)가 필수임
* 복사 생성자의 인수로는 객체 자체를 인수로 전달하면 무한 반복이 되기때문에 객체 자체가 아닌 포인터로 넣어줘야함
* & 값으로 대입해주는 디폴트 복사 생성자가 원래 존재하기 때문에 특수한 상황이 따로 설정을 안해줘도 됌
멤버 초기화 리스트
* 함수 선두와 본체 사이에 :을 찍고 멤버와 초기값의 대응 관계를 나열하는 것
예) Position(int ax, int ay, char ach) : x(ax),y(ay),ch(ach)
상수 멤버 초기화
* 선언시 반드시 초기화를 해야하나, 클래스의 멤버일 경우 객체가 만들어질 때까지 초기화를 연기할 수 있으며, 생성자의 초기화 리스트에서만 초기화 가능하다.
레퍼런스 멤버 초기화
* 레퍼런스는 생성 직후부터 별명으로 동작해야 하므로 선언될때 짝이될 변수를 지정해줘야하는데, 예외의 경우가 바로 클래스의 멤버로 선언될때이다.
포함된 객체 초기화
생성자는 객체를 생성할 때만 호출할 수 있으며 외부에서 명시적으로 호출할 수 없기때문이다.
변환 생성자
기본 타입으로부터 객체를 만드는 생성자이며 인수를 하나만 취한다.
자동으로 암시적 변환하는 장점도 있지만, 의도되지않은 인수를 집어넣음에도 암시적으로 변환하여 잘못된 코드 디버깅을 할때에 불편함이 존재할 수 있다.
-> 생성자앞에 explicit 를 지정하여 명시적으로 변환하게끔 구성할 수 있다.
변환 함수
* 객체를 만드는 생성자와 반대로 객체를 원하는 타입으로 변환시키고 싶을 때 쓰는 함수
예)
변환 함수의 형식
operator 변환타입()
{
본체
}
* 암시적으로 변환을 금지시키는 안전장치가 없으므로 변환 함수를 쓰기보다는 명시적으로 멤버 함수를 선언하여 사용하는것을 권장
클래스간의 변환
* 클래스는 기본타입과 다른것이 하나도 없으므로, 똑같이 클래스끼리 변환이 가능하다.
참고사이트 : http://www.soen.kr/