C++에서 클래스의 전용 멤버에 액세스

Jinku Hu 2023년10월12일
  1. private액세스 지정자를 사용하여 C++에서 클래스 멤버 캡슐화
  2. public함수를 사용하여 C++에서 클래스의 전용 멤버 검색
C++에서 클래스의 전용 멤버에 액세스

이 기사에서는 C++에서 클래스의 개인 멤버에 액세스하는 방법에 대한 몇 가지 방법을 설명합니다.

private액세스 지정자를 사용하여 C++에서 클래스 멤버 캡슐화

액세스 지정자는 캡슐화라고하는 객체 지향 프로그래밍의 핵심 기능을 구현하는 데 사용됩니다. 결과적으로 우리는 클래스의 특정 데이터 멤버에 대한 직접 액세스를 제한하고 기본적으로 클래스 데이터에서 작동하는 인터페이스를 구성합니다. C++는public,privateprotected와 같은 여러 액세스 지정자 키워드를 제공합니다. 일반적으로 해당 액세스 가능성으로 규정되어야하는 클래스의 멤버 앞에옵니다.

private지정자 뒤에 정의 된 멤버는 멤버 함수에서만 액세스 할 수 있으며 클래스를 사용하는 코드에서 직접 참조 할 수 없습니다. 클래스는 일반적으로 클래스의 디자이너와 클래스의 사용자라는 두 가지 측면을 염두에두고 구성됩니다. 후자는 일반적으로 캡슐화의 영향을받는 사람입니다. 프로그래머가 첫 번째 액세스 지정자 앞에 멤버를 정의하는 경우, 해당 액세스 가능성은class키워드가 사용될 때 기본적으로private로 설정되고struct키워드에public이 설정됩니다.

다음 예에서는private로 선언 된 두 개의 문자열 데이터 멤버가있는BaseClass라는 클래스를 구현합니다. 따라서 이러한 멤버의 값에 액세스하려면 클래스 디자이너가이를 검색하는public함수를 포함해야합니다. 아래 코드에서public키워드를 제거하고public멤버로getUsernamegetName함수를 계속 사용할 수 있습니다.

캡슐화의 또 다른 장점은 사용자 측의 호환성 문제에 대해 걱정하지 않고 내부 클래스 구조를 수정할 수있는 유연성입니다. 따라서 인터페이스가 공용 함수가 변경되지 않는 한 클래스 사용자는 코드를 수정할 필요가 없습니다.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class BaseClass {
 public:
  BaseClass() = default;
  explicit BaseClass(string user, string nm)
      : username(std::move(user)), name(std::move(nm)) {}

  ~BaseClass() = default;

  string& getUsername() { return username; };
  string& getName() { return name; };

 private:
  string username;
  string name;
};

int main() {
  BaseClass base("buddy", "Buddy Bean");

  cout << "base -> name: " << base.getName() << endl;
  cout << "base -> username: " << base.getUsername() << endl;

  exit(EXIT_SUCCESS);
}

출력:

base -> name: Buddy Bean
base -> username: buddy

public함수를 사용하여 C++에서 클래스의 전용 멤버 검색

private 멤버는 클래스 인터페이스 함수를 사용하여 수정할 수 있습니다. 예를 들어changeUsername 함수는 클래스 사용자로부터string 인수를 취하고 값을private 멤버 인username에 저장합니다. 클래스의 private멤버에 액세스 할 수있는 다른 클래스와 함수를 구분하는 friend키워드도 있습니다. 이러한 함수는 위에서 언급 한 클래스의 일부가 아닌 외부 일 수 있습니다. 그러나 액세스 지정자를 잘못 사용하면 컴파일러 오류가 발생할 가능성이 큽니다.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class BaseClass {
 public:
  BaseClass() = default;
  explicit BaseClass(string user, string nm)
      : username(std::move(user)), name(std::move(nm)) {}

  ~BaseClass() = default;

  void changeUsername(const string& s) { username.assign(s); };

  string& getUsername() { return username; };
  string& getName() { return name; };

 private:
  string username;
  string name;
};

int main() {
  BaseClass base("buddy", "Buddy Bean");

  cout << "base -> name: " << base.getName() << endl;
  cout << "base -> username: " << base.getUsername() << endl;
  base.changeUsername("jolly");
  cout << "base -> username: " << base.getUsername() << endl;

  exit(EXIT_SUCCESS);
}

출력:

base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Class