-
Ch_3 클래스 본문
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 |
---|