C++에서 클래스의 함수 선언에 있는 const 키워드

Shikha Chaudhary 2024년2월16일
  1. C++ 클래스의 함수 선언에서 const 키워드
  2. C++에서 멤버 함수의 동작
  3. C++에서 const 멤버 함수의 동작
  4. 결론
C++에서 클래스의 함수 선언에 있는 const 키워드

C++에서 const 키워드는 프로그램 실행 중에 변경되지 않고 일정하게 유지되는 값을 정의합니다. 이것은 변수와 변수가 보유한 데이터에 대해 매우 간단하게 들립니다.

그러나 어떻게 함수를 상수로 선언할 수 있으며 함수에서 변경되지 않은 상태로 유지되어야 하는 것은 무엇입니까? 이 기사에서 이러한 모든 질문에 답할 것이므로 계속 읽으십시오!

여기서 보고 있는 함수는 클래스에 속하는 함수, 즉 멤버 함수입니다.

C++ 클래스의 함수 선언에서 const 키워드

실제 토론에 들어가기 전에 문제 설명을 올바르게 이해합시다.

우리는 이미 클래스가 데이터 멤버와 멤버 함수를 가질 수 있다는 것을 알고 있습니다. 이러한 멤버 함수는 일반적으로 다음과 같이 클래스 내에서 선언됩니다.

class Demo  // class
{
 public:
  int x;
  int showDemo();  // member function declaration
}

여기서 멤버 함수 showDemo()Demo 클래스에 속합니다. 그러나 다음과 같이 멤버 함수 끝에 const를 추가하면 무엇을 의미합니까?

class Demo  // class
{
 public:
  int x;
  int showDemo() const;  // const member function declaration
}

이를 이해하기 위해 C++에서 멤버 함수가 일반적으로 어떻게 작동하는지 먼저 살펴보겠습니다.

C++에서 멤버 함수의 동작

아래 주어진 코드를보십시오. 여기에서 먼저 값이 2,로 설정된 chocolate 데이터 멤버와 Desert() 멤버 함수로 Demo라는 클래스를 정의합니다.

멤버 함수 내에서 welcome 문과 함께 데이터 멤버 chocolate의 원래 값을 인쇄한 다음 이 값을 1씩 증가시킵니다. 또한 다음 명령문에서 초콜릿의 증가된 값을 인쇄합니다.

마지막으로 demo 객체를 생성하고 main 블록에서 Desert() 멤버 함수를 호출합니다. 또한 객체 demodot 연산자를 사용하여 chocolate 값을 인쇄합니다.

#include <iostream>
using namespace std;

class Demo {
 public:
  int chocolates = 2;

 public:
  void Desert()  // member function
  {
    cout << "Hello Chocolates" << endl;
    cout << "Before change: " << chocolates << endl;
    chocolates++;
    cout << "After change: " << chocolates << endl;
  }
};

int main() {
  Demo demo;
  demo.Desert();
  cout << demo.chocolates << endl;
}

출력:

Hello Chocolates
Before change: 2
After change: 3
3

여기에서 멤버 함수 내부에서 데이터 멤버 chocolate의 값을 변경한 것을 볼 수 있습니다. 변경 사항을 보다 정확하게 강조하기 위해 main 블록에서도 이 변수의 값을 인쇄하지만 여전히 3이라는 업데이트된 값을 얻습니다.

따라서 이 예제는 개체를 변경하기 위해 일반 멤버 함수를 어떻게든 사용할 수 있음을 의미합니다.

여기에는 하나의 클래스와 하나의 객체만 있습니다. 그러나 많은 클래스와 개체로 작업하는 동안 실수로 개체가 변경될 가능성이 높습니다.

이를 방지하기 위해 C++의 const 멤버 함수를 사용합니다.

C++에서 const 멤버 함수의 동작

아래 주어진 예를 보십시오. 이 코드는 이번에는 멤버 함수 뒤에 const 키워드를 넣는 것을 제외하면 이전 코드와 동일합니다.

#include <iostream>
using namespace std;

class Demo {
 public:
  int chocolates = 2;

 public:
  void Desert() const  // const member function
  {
    cout << "Hello Chocolates" << endl;
    cout << "Before change: " << chocolates << endl;
    chocolates++;
    cout << "After change: " << chocolates << endl;
  }
};

int main() {
  Demo demo;
  demo.Desert();
  cout << demo.chocolates << endl;
}

출력:

In member function 'void Demo::Desert() const':
error: increment of member 'Demo::chocolates' in read-only object
   13 |             chocolates++;
      |             ^~~~~~~~~~

멤버 함수를 상수로 만들어 출력이 어떻게 변하는지 확인할 수 있습니다. 이번에는 초콜릿의 값이 증가하지 않아 오류가 발생합니다.

따라서 이 예는 const 멤버 함수를 사용하여 어떤 식으로든 개체를 변경할 수 없음을 의미합니다.

멤버 함수에 대한 위의 두 가지 비교를 통해 이러한 함수 선언에서 const를 사용하면 클래스 멤버가 변경되지 않는다는 결론을 내립니다. 메서드에 const를 추가하면 this 포인터가 const 개체를 가리키므로 데이터 멤버를 변경할 수 없습니다.

우리가 배운 모든 것 후에 객체 변경을 피하기 위해 const 멤버 함수를 사용한다고 말할 수 있습니다. 그러나 다음과 같은 질문이 있을 수 있습니다. const 개체의 용도는 무엇입니까?

개체를 const로 선언하면 const 멤버 함수만 호출할 수 있습니다. 이는 const 개체를 수정할 수 없고 이 비변경은 const 멤버 함수에 의해서만 약속되기 때문입니다.

아래 예를 보십시오.

Desert 클래스에는 desert()desert() const라는 두 개의 멤버 함수가 있습니다. 그런 다음 main 블록 내에서 두 개체 d와 상수 개체 dd를 정의합니다.

이 예제에 대한 몇 가지 중요한 사항에 유의하십시오.

  1. 같은 이름을 가진 두 개의 멤버 함수가 있습니다. 유일한 차이점은 그 중 하나가 const 멤버 함수라는 것입니다.
  2. 두 개의 객체가 있는데 그 중 하나는 상수 객체입니다.
  3. 어떤 객체가 어떤 함수를 호출하는지 지정하지 않고 두 객체에서 멤버 함수 desert()를 호출합니다.
#include <iostream>
using namespace std;

class Desert {
 private:
  int cakes;

 public:
  void desert() { cout << "The first desert function." << endl; }

  void desert() const  // the const member function
  {
    cout << "The second const desert function." << endl;
  }
};

int main() {
  Desert d;              // object of class
  const Desert& dd = d;  // constant object of class
  d.desert();
  dd.desert();
}

출력:

The first desert function.
The second const desert function.

출력은 일반 멤버 함수 desert()가 일반 객체 d에 의해 자동으로 호출되었음을 명확하게 보여줍니다. 반면 const 멤버 함수 desert() constconst 개체 dd에 의해 자동으로 호출됩니다.

개체에서 const 키워드를 제거하면 출력이 변경됩니다.

int main() {
  Desert d;        // object of class
  Desert& dd = d;  // remove the constant keyword
  d.desert();
  dd.desert();
}

출력:

The first desert function.
The first desert function.

이번에는 두 개체가 첫 번째 함수를 호출합니다. 이는 const 객체가 const 멤버 함수를 호출함을 증명합니다.

이것은 상수가 아닌 객체에서 const 멤버 함수를 호출할 수 없다는 의미는 아닙니다. 그러나 const가 아닌 함수는 const가 아닌 객체에 의해서만 호출될 수 있습니다.

지금까지는 그렇게 좋았지 만 예외적인 경우가 있습니다. 클래스의 데이터 멤버와 함께 mutable 한정자를 사용하면 const 메서드에서도 개체를 수정할 수 있습니다.

이 예를 보십시오.

#include <iostream>
using namespace std;

class Demo {
 public:
  mutable int chocolates = 2;  // mutable quantifier
 public:
  void Desert() const  // const member function
  {
    cout << "Hello Chocolates" << endl;
    cout << "Before change: " << chocolates << endl;
    chocolates++;
    cout << "After change: " << chocolates << endl;
  }
};

int main() {
  Demo demo;
  demo.Desert();
  cout << demo.chocolates << endl;
}

출력:

Hello Chocolates
Before change: 2
After change: 3
3

이번에는 chocolate 데이터 멤버와 함께 mutable 수량자를 사용하기 때문에 이전과 같은 오류가 발생하지 않습니다. 이는 메서드가 호출된 횟수를 계산하려는 경우에 종종 유용합니다.

이것은 C++의 const 멤버 함수에 관한 것입니다. 여기 저기에 약간의 변경을 가하면서 예제를 더 많이 사용할수록 더 명확해질 것입니다!

C++의 const에 대한 자세한 내용은 문서를 참조하세요.

결론

이 기사에서는 C++의 const 멤버 함수 개념에 대해 논의했습니다. const 멤버 함수는 개체가 실수로 수정되지 않도록 보장하며 constconst가 아닌 개체와 함께 사용할 수 있습니다.

그러나 const 개체는 const 멤버 함수만 취소할 수 있습니다. 또한 데이터 멤버와 함께 mutable 키워드를 사용하면 const 멤버 함수의 일반적인 동작을 변경할 수 있으며 일반적으로 계산 목적으로 사용됩니다.

관련 문장 - C++ Function