C++

[#5 열혈강의 C++]

Kmentor 2021. 7. 4. 20:53

2021-07-04

[Chapter 04] 클래스의 완성

 

const 함수는 

int GetX() const; 같은 형태이다.

이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다. 라는 의미이다.

따라서, 이 함수 내에서 멤버변수의 값을 변경하는 코드가 삽입되면 컴파일 에러가 발생한다.

const함수 내에서는 const함수가 아닌 함수의 호출은 제한된다.

 

캡슐화는 관련있는 함수나 변수를 하나의 클래스 안에 묶는 것이다.

 

생성자(Constuctor)는 이 함수의 이름과 클래스의 이름이 동일하며 반환형이 없다.

SimpleClass sc1(); x---line1

Simpleclass sc2;  o----line2

만약 SimpleClass sc1() {~} 라는 함수가 있는 경우에 line1번이 객체 생성인지, 함수호출인지 구별 할 수가 없어진다. 그래서 line2번같은 생성문을 사용한다.

 

멤버 이니셜라이저를 통해서 멤버 초기화, 변수 및 const상수 초기화가 가능하다.

Rectangle::Rectangle(~) :  upLeft(x1, y1),lowRight(x2,y2) {}

SoSimple(int n1, int n2) : num1(n1) {}

같은 형태로 함수 뒤에 : 를 붙인 뒤 초기화 하고 싶은 멤버나 변수, 상수를 쓰고 괄호안에 초기화값을 작성하면된다.

이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다.

const 변수는 선언과 동시에 초기화 해야하므로 이니셜라이저를 통해 초기화가 가능하다.

참조자도 마찬가지이다. 참조자나 const변수가 멤버변수로 있다면 생성자에서 이니셜라이저를 통해 초기화를 하면 된다.

 

디폴트 생성자는 생성자를 정의하지 않은 클래스에서 C++컴파일러에 의해서 자동으로 삽입된다.

객체는 메모리 공간의 할당 이후에 호출까지 완료되어야한다. 따라서 반드시 하나의 생성자가 호출되어야 하기 때문에  디폴트 생성자가 삽입되는 것 이다.

단 malloc함수를 이용하면 생성자가 호출되지 않는다.

AAA *ptr = (AAA * )malloc( sizeof(AAA) ); x

malloc함수 호출시 AAA클래스의 크기정보만 바이트 단위로 전달되기 때문에 생성자 호출이 안된다. 

 

객체 배열은 

SoSimple arr[10]; 같은 형태이다. 만약 동적할당 하는 경우에는 SoSimple * ptrArr = new SoSimple[10]; 이다.

이를 위해선, 생성자. SoSimple ( ) { } 가 있어야하고 이 생성자가 10번 호출된다.

 

객체 포인터 배열은 객체의 주소 값이 저장이 가능한 포인터 변수로 이뤄진 배열이다.

Person * parr[3] ;

parr[i] = new Person (namestr, age) ;

같은 형태인데, Person 객체의 주소 값이 배열 parr에 각각 저장된다.

 

this 포인터는 객체 자신을 가리키는 용도의 포인터이다. 객체자신의 주소 값을 의미한다.

 



***-------***

구조체 배열과 구조체 포인터 배열에 대하여.