-

Ch_3 클래스 본문

CS Language Note/C++ 정리

Ch_3 클래스

Boogallee 2018. 1. 17. 16:23

3.1 클래스와 구조체의 유사점 및 차이점

- 클래스는 정말 쉽게 생각하면 함수를 포함할 수 있는 구조체라고 할 수도 있다.

- 구조체 안에 함수가 존재하는것과 유사하지만, C언어에서는 문법적으로는 클래스와 똑같이 구현하는 것은 불가능하다.

TMP a = {"name",age};

a.Function(&a)  // a.Function()


함수(메소드)를 호출하는데 있어서 차이가 있다. this 포인터와 관련 있다.(객체가 생성된 시점에서의 객체 주소를 모르기 때문에 this 사용)


- 구조체와 다르게 "생성자"를 이용해서 초기화 할 수 있다.

- 생성자는 반환자료형이 없고, 자동으로 호출되는 함수.

- 멤버 변수가 참조자 형식이면 반드시 초기화 목록을 이용해서 초기화 해야한다.(평소에도 사용가능하다)

CTEST()

:m_ndata(10), m_ndata2(20)

{ }


- 접근 제어 지시자

* public : 모든 외부 접근 허용

* protected : 외부 접근 차단/ 상속 관게에 있는 파생 클래스에서는 접근 헝요

* private : 파생 클래스로부터의 접근까지 모두 차단. 접근 제어지시자 기술하지 않으면 private이 default.



3.3 생성자와 소멸자

- 매개변수가 하나도 없는 생성자를 "디폴트 생성자"라고 한다. 컴파일러가 알아서 생성함.

- 전역 변수로 선언한 클래스의 생성자는 main 보다 먼저 호출된다.

- 생성자는 다중정의 가능 / 소멸자는 다중저으이 불가능

- main 이 끝난 후에 소멸자가 호출 될 수 있다.

- 생성자/소멸자는 생략 가능하나, 생략할 경우 컴파일러가 생성한다.

- C++11 부터는 '생성자 위임'이 지원됨

다중정의 대신에 생성자 초기화 목록에서 다른 생성자를 추가로 호출 할 수 있다. (생성자 다중정의 때문에 발생하는 코드 중복을 피할 수 있다.

- 명시적 디폴트 생성자

TEST(void) = default;   // TEST(void) = delete;  디폴트 생성자를 명시적으로 만들고 삭제

왜필요한지 이해는 안가지만, 불필요한 함수의 삭제를 위함이란다. 메모리관리나 최적화와 관련있을 듯.


3.4 메서드

- 정의: 클래스가 제공하는 기능을 실행하는 방법

- this 포인터

* 제작자가 작성중인 클래스의 실제 인스턴스에 대한 주소를 가리키는 포인터

* 휴대폰의 시리얼 번호와 같다. 시리얼번호는 제품을 생산하는 단계에서 결정되는데, 제작자가 아직 결정되지 않은 시리얼 번호를 이용해야하는 프로그램 코드를 작성해야할 때 필요.

* a.fucntion(); 으로 호출한다면 실제로는 객체의 주소인 &a 가 전달되는 것. 클래스 내부에서는 이것을 this 로 받아서 사용한다. 즉, 객체가 생성된 이후의 시점에서 객체의 주소가 그전에 필요한 것.


- const 메서드 

* this 포인터 접근: 가능

* 일반 멤버 읽기 : 가능

* 일반 멤버 쓰기 : 불가능

* 정적 멤버 읽기 : 가능

* 정적 멤버 쓰기 : 불가능

// 멤버 쓰기 방지가 목적이다.


* 멤버 변수에 읽기 접근은 허용하지만 쓰기는 허용되지 않는 매서드 

* 해당 메서드 안에서는 멤버 변수 쓰기 불가능 및 상수형 메서드가 아닌 멤버는 호출 할 수 없다.

* 하지만 상수형 메서드 안에서 꼭 변수 수정(쓰기)가 필요하다면 mutable로 선언한 멤버는 허용된다.

ex) mutable int data = 0;

* 상수형 참조를 변경할 때는 const_cast< > 사용.

const_cast<새형식> (대상)  // 괄호를 절대 생략해서는 안된다.

ex) int &newparam = const_cast<int &>(nparam) // 메서드의 매개변수 형식: const int &nparam // 

     newparam = 20; // 참조자 형식이지만 변경 가능.


- 정적 메서드

* this 포인터 접근 : 불가능

* 일반 멤버 읽기/쓰기 : 제한적 가능

* 정적 멤버 읽기/쓰기 : 가능

// C의 전역 함수와 유사



'CS Language Note > C++ 정리' 카테고리의 다른 글

Ch_2 C++ 함수와 네임스페이스  (0) 2018.01.17
Comments