본문 바로가기
프로그래밍 언어/C++

C++ 3단원 복습! (2편)

by 조엘 2020. 3. 12.

안녕하세요. 파피몬입니다.

 

이 복습 내용은 최호성 선생님의 "이것이 C++이다"를 공부하고 작성하였습니다. 

아직 모르는 게 많은 학생이라 오개념이 있을 수 있습니다. 친절하게 댓글로 알려주시면 좋은 공부 될 것 같습니다!!

3단원에서는 클래스에 대해서 배워봅니다. 1편, 2편으로 나누어져 있습니다.

 

Chapter 3. 클래스

 

5. 객체를 동적 할당할 때에는 new/delete 연산자를 써주도록 합니다. C언어의 malloc()/free()함수는 객체를 위한 메모리만을 할당해 줄 뿐, 객체가 사용할 메모리는 될 수 없습니다. (C언어에서는 객체의 개념이 없어서 그런가....)

//클래스 CTest가 정의되어 있다고 가정

//C언어 스타일
//그저 heap영역에서 CTest객체의 크기만큼의 메모리를 할당받아와 그 주소 pTest에 넣어주기
//"pTest->멤버변수" 방식의 접근은 불가능!
CTest *pTest = (CTest*)malloc(sizeof(CTest));
free (pTest);

//C++ 스타일
//pNewTest에 CTest 인스턴스를 동적할당 하는 것!
//"pNewTest->멤버변수" 방식의 접근 아주가능!
CTest *pNewTest = new CTest;
delete pNewTest;

 

 

6. this 포인터는 작성 중인 클래스의 실제 인스턴스에 대한 주소를 가리키는 포인터입니다. this 포인터는 객체의 주소로 method가 call될 때 자동으로 초기화됩니다. 

 

 

7. 메서드는 클래스에서 멤버함수를 지칭합니다. '클래스가 제공하는 기능을 실행하는 방법'으로 생각하면 좋습니다. 

 

 

8. 상수형 메서드는 멤버 변수에 읽기 접근은 가능하지만 쓰기는 허용되지 않습니다. 함수 원형뒤에 const 예약어를 붙이면 됩니다. const를 통해 this 포인터를 상수형 포인터로 변경합니다. 책에서는 다음과 같이 설명합니다.

"상수형 메서드는 절대로(혹은 문법적으로) 멤버 변수의 값을 쓸 수 없고, 상수형 메서드가 아닌 멤버는 호출할 수 없다"

가능하다면 최대한 많은 양의 const 예약어를 쓰는게 좋다고 합니다. 

 

 

9.  상수형 메서드에서 예외 사항이 발생하기도 하는데, mutable 예약어와 const_cast<> 형변환 연산자 입니다. 

#include<iostream>
using namespace std;

class CTest
{
public:
    CTest(int nParam) : m_nData(nParam) { }
    ~CTest() { }
    
    int GetData() const
    {
        //상수형 메서드 이지만, mutable 멤버변수에는 접근가능!
        m_nData = 20;
        return m_nData;
    }

private:
    mutable int m_nData = 0;
};

void TestFunc(const int &nParam)
{
    int &nNewParam = const_cast<int &>(nParam);
    nNewParam = 20;
}    

int main()
{
    CTest a(10);
    cout<< a.GetData() <<endl;
    
    int nData = 10;
    TestFunc(nData);
    cout<< nData <<endl;
    
    return 0;
}

--------------------
20
20

 

 

10. delete 예약어를 통해 해당 클래스의 메소드의 실인수로 의도와 다른 자료형이 넘어오는 경우를 차단할 수 있습니다.  ex) void SetData(double dParam) = delete; 

 

 

11. 정적(static) 멤버는 전역 변수/함수와 같은 역할인데 클래스의 멤버로 들어왔을 뿐입니다. 인스턴스를 선언하지 않고 직접 호출이 가능하며, this포인터를 사용할 수 없습니다. 또한 정적 변수는 필히 선언과 정의를 분리합니다. 

class CTest
{
public:
    CTest(int nParam) : m_nData(nParam) { m_nCount++; }
    int GetData() { return m_nData; }
    void ResetCount() { m_nCount = 0; }
    
    //정적 메서드 선언 및 정의!
    static int GetCount()
    {
        return m_nCount;
    }

private:
    int m_nData;
    
    //정적 멤버 변수 선언!
    static int m_nCount;
};

//정적 멤버 변수 정의!
int CTest::m_nCount = 0;
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 4단원 복습! (2편)  (0) 2020.03.15
C++ 4단원 복습! (1편)  (0) 2020.03.14
C++ 3단원 복습! (1편)  (0) 2020.03.12
C++ 2단원 복습!  (0) 2020.03.11
C++ 1단원 복습!  (0) 2020.03.10

댓글