classes objects c
C ++의 클래스와 객체에 대한 간략한 소개.
클래스와 객체는 C ++에서 객체 지향 프로그래밍의 빌딩 블록입니다. 살아있는 또는 무생물의 모든 엔티티는 객체로 표현 될 수 있으며 그에 따라 C ++를 사용하여 프로그래밍됩니다. 따라서 자동차, 책상, 사람, 새, 동물 등과 같은 개체를 개체로 나타낼 수 있습니다.
클래스는 개체보다 높은 수준이며 개체의 범주를 나타냅니다. 따라서 클래스는 객체 디자인과 세부 사항을 설명하는 청사진 역할을합니다. 여기에는 개체를 설명하는 데 사용되는 데이터와 개체 데이터에 대해 작동 할 수있는 다양한 메서드 또는 기능이 포함됩니다.
이 자습서에서는 프로그래밍 방식 표현과 함께 C ++의 클래스 및 개체에 대한 모든 세부 정보를 설명합니다.
학습 내용 :
클래스
C ++의 클래스는 청사진 또는 특정 엔터티의 골격으로 볼 수 있습니다. 클래스는 사용자 정의 데이터 유형입니다. 여기에는 특정 엔티티와 해당 엔티티에서 작동하는 기능에 대한 일반 정보 또는 데이터가 포함됩니다.
C ++ 구문에서 우리는 'class'키워드와 클래스 이름을 가진 클래스를 정의합니다.
클래스 이름 뒤에는 중괄호로 묶인 클래스 세부 정보가오고 세미콜론으로 끝납니다.
다음 블록은 클래스 정의에 대한 일반 구문을 보여줍니다.
위의 표현에서 볼 수 있듯이 클래스는 public / protected / private와 같은 액세스 지정자를 가질 수 있습니다. 데이터 멤버와 멤버 함수를 가질 수 있습니다. 데이터와 함수는 클래스의 멤버로 호출됩니다. 기본적으로 멤버는 클래스 전용이므로 외부 엔터티가 이러한 멤버에 액세스 할 수 없습니다.
예를 들어, 차량은 모델, 색상, 섀시 번호, 평균 속도 등과 같은 속성을 가진 일반화 된 클래스 일 수 있습니다. 데이터 멤버에 대한 작업을 수행하는 changeModel, 가속, 감속 등과 같은 기능을 가질 수 있습니다. 이러한 모든 데이터 멤버와 기능을 포함하는 'vehicle'이라는 클래스를 정의 할 수 있습니다.
이미 언급했듯이 클래스는 엔티티의 청사진 일뿐입니다. 정의 될 때 메모리 공간을 차지하지 않습니다. 클래스가 작동하려면 클래스 멤버를 사용할 수있는 객체를 정의해야합니다.
사물
클래스 기능을 사용하려면 클래스를 인스턴스화하여 객체를 생성해야합니다. 객체는 클래스의 인스턴스입니다. 간단히 말해서 객체는 클래스 유형의 변수라고 말할 수 있습니다.
개체를 만드는 일반적인 구문은 다음과 같습니다.
classname object_name;
개체가 생성되면 해당 클래스의 데이터 멤버 및 함수에 액세스하는 데 사용할 수 있습니다.
클래스의 멤버 (데이터 및 함수)에 액세스하려면 멤버 액세스 연산자라고도하는 점 (.) 연산자를 사용합니다.
obj가 객체의 이름이고 클래스에 'display ()'함수가있는 경우 해당 함수는 'obj.display ()'로 액세스 할 수 있습니다.
그러나 위의 진술에는 캐치가 있습니다. 함수가 '공용'인 경우 객체와 도트 연산자를 사용하여 함수 디스플레이 ()에 액세스 할 수 있습니다.
액세스 지정자
C ++에서 클래스의 데이터 멤버 및 함수에 액세스하는 것은 액세스 지정자를 사용하여 특정 데이터 멤버 또는 함수에 부여 된 액세스에 따라 달라집니다.
C ++는 다음 액세스 지정자를 지원합니다.
# 1) 비공개
이것은 C ++의 클래스에 대한 기본 액세스 지정자입니다. 즉, 클래스의 멤버에 대해 액세스 지정자가 지정되지 않은 경우 개인용으로 간주됩니다.
멤버가 비공개 인 경우 클래스 외부에서 액세스 할 수 없습니다. 객체와 점 연산자도 사용하지 않습니다. 프라이빗 데이터 멤버는 클래스의 멤버 함수를 통해서만 액세스 할 수 있습니다.
C #의 oops 개념과 숙련 된 예제
그러나이 규칙에는 예외가 있으며 이후 주제에서 논의 할 것입니다.
# 2) 공개
클래스에서 공용으로 정의 된 데이터 멤버 또는 함수는 클래스 외부의 모든 사용자가 액세스 할 수 있습니다. 이러한 멤버는 개체 및 점 연산자를 사용하여 액세스 할 수 있습니다.
# 3) 보호
클래스의 보호 된 멤버는 클래스 자체와 해당 클래스의 자식 클래스에 액세스 할 수 있습니다.
이 액세스 지정자는 특히 상속의 경우에 사용되며 상속 주제를 논의하면서 이에 대해 자세히 설명합니다.
이러한 액세스 지정자를 더 잘 이해하기 위해 다음 예제를 살펴 보겠습니다.
#include #include using namespace std; class ABC{ int var1 = 10; public: string name; void display() { cout<<'var1 ='< 산출:
var1 = 10
이름 = sth
이 프로그램에는 int 유형의 var1이 private (접근 지정자가 지정되지 않음. 기본값은 private) 인 두 개의 데이터 멤버가 있습니다. 또 다른 멤버는 public으로 선언 된 문자열 이름입니다. 이 두 멤버의 값을 표시하는 또 다른 기능 디스플레이가 있습니다.
주 함수에서 우리는 클래스 ABC의 객체 abc를 선언합니다. 그런 다음 데이터 멤버에 값을 설정하고 'abc'개체를 사용하여 함수 표시를 호출합니다.
그러나 컴파일러가 abc.var1 = 20 행을 만나면; 'var1이 개인 변수입니다'라는 오류가 발생합니다.
이는 클래스 외부의 클래스의 개인 데이터 멤버에 액세스 할 수 없기 때문입니다. 따라서 오류가 있습니다. 그러나 우리는 함수 내에서 접근 할 수 있고 따라서 디스플레이 함수에서 var1의 값을 출력 할 때; 오류가 발생하지 않습니다.
따라서 프로그램의 출력은 var1이 선언 된 초기 값을 표시합니다.
지금까지 클래스, 객체 및 액세스 지정자에 대한 세부 정보를 살펴 보았으므로 이제 샘플 클래스 학생의 전체 예제를 살펴 보겠습니다. 이 클래스에는 student_id, student_name 및 student_age와 같은 데이터 멤버가 있습니다. 또한 학생 정보를 읽고 학생 정보를 표시하는 멤버 기능이 있습니다.
독자들이 쉽게 이해할 수 있도록 클래스의 모든 멤버를 공용으로 선언했습니다.
다음 프로그램은 완전한 구현을 보여줍니다.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; void read_studentInfo(); void print_studentInfo() { cout<<'
Student ID : '<student_id; cout<>student_name; cout<>student_age; } int main() { student s1; s1.read_studentInfo(); s1.print_studentInfo(); }
산출:
학생 ID 입력 : 1
student_name : abc 입력
student_age 입력 : 12
학생 ID : 1
학생 명 : abc
학생 연령 : 12 세
따라서 위에 정의 된 완전한 클래스가 있습니다. 유일한 차이점은 클래스 내부에 'print_studentInfo'함수 하나를 정의한 반면 다른 'read_studentinfo'함수는 클래스 외부에 정의했다는 것입니다. 클래스에 대해 멤버 함수를 정의 할 수있는 두 가지 방법이 있습니다.
외부에서 정의 된 함수는 여전히 클래스 내부에 선언 / 프로토 타입이 있습니다. 또한 클래스 외부에서 범위 확인 연산자 (: :) . 그런 다음 주 함수에서 학생 클래스 객체를 만든 다음 함수를 호출하여 데이터를 읽고 표시합니다.
생성자
지금까지이 자습서에서 간단한 개체를 만든 다음 표준 입력에서 이러한 값을 읽은 후 main 함수에서 클래스의 각 데이터 멤버에 값을 할당합니다.
이 항목에서는 개체를 만드는 동안 초기화하는 데 사용되는 특수 함수를 살펴 보겠습니다. 이 특수 함수를 생성자라고합니다.
생성자는 클래스의 멤버 함수이지만 다음과 같은 점에서 일반 멤버 함수와 다릅니다.
- 생성자는 반환 값이 없습니다. 즉 생성자는 값을 반환하지 않습니다.
- 클래스의 공용 멤버 함수입니다.
- 데이터 멤버를 초기화하고 클래스의 개체를 구성하는 데 사용됩니다.
- 객체가 생성 될 때 컴파일러에 의해 자동으로 호출됩니다.
생성자의 유형
C ++는 다음 유형의 생성자를 지원합니다.
# 1) 기본 생성자
기본 생성자는 기본 생성자이며 매개 변수가 없습니다. 기본 생성자를 사용하여 매개 변수없이 간단한 객체를 만들 수 있습니다.
기본 생성자의 구문은 다음과 같습니다.
classname() { //constructor code }
클래스에 기본 생성자가 없으면 컴파일러가 생성합니다.
# 2) 매개 변수화 된 생성자
매개 변수화 된 생성자는 클래스 멤버를 초기화 할 수있는 매개 변수 목록이있는 생성자입니다. 매개 변수화 된 생성자에서 객체를 선언 할 때 초기 값을 생성자 함수에 매개 변수로 전달해야합니다.
매개 변수화 된 생성자 함수는 아래와 같습니다.
classname(argument list){ //constructor code }
매개 변수가있는 생성자는 생성자를 오버로드하는 데 사용됩니다. 이후 주제에서 오버로딩에 대해 더 자세히 알아볼 것입니다.
매개 변수가있는 생성자는 다른 개체의 데이터 멤버를 초기화하는 데 사용됩니다. 이렇게하는 동안 데이터 멤버의 다른 값을 다른 개체에 전달할 수 있습니다.
# 3) 복사 생성자
C ++는 복사 생성자라고하는 세 번째 유형의 생성자를 지원합니다. 일반적인 형태는
클래스 이름 (상수 클래스 이름 & obj);
위의 선언에서 볼 수 있듯이 복사 생성자에서 동일한 클래스의 다른 객체 값을 사용하여 새 객체가 생성됩니다. 생성자에 전달되는 매개 변수는 값이 새 객체의 생성에 사용될 객체의 상수 참조입니다.
복사 생성자는 일반적으로 다음 상황에서 호출됩니다.
- 클래스 객체가 값으로 반환 될 때.
- 객체가 인수로 함수에 전달되고 값으로 전달되는 경우입니다.
- 객체가 같은 클래스의 다른 객체에서 생성 된 경우.
- 컴파일러에서 임시 개체를 생성 할 때.
그러나 C ++ 컴파일러에는 복사 작업을 최적화하는 방법이 있으므로 위의 모든 경우에서 복사 생성자가 반드시 호출 될 것이라고 보장 할 수 없습니다.
복사 생성자는 개체간에 구성원 별 복사를 수행합니다. 기본 생성자와 마찬가지로 C ++ 컴파일러는 프로그램에 기본 복사 생성자를 제공하지 않으면 기본 복사 생성자를 만듭니다. 그러나 클래스에 포인터, 참조 또는 리소스의 런타임 할당과 같은 특정 데이터 멤버가 있으면 자체 사용자 정의 복사 생성자가 있어야합니다.
그 이유는 기본 복사 생성자가 데이터 멤버의 얕은 복사 만 수행하기 때문입니다. 즉, 두 객체가 동일한 메모리 위치를 공유하기 때문입니다. 이것은 포인터가 아닌 간단한 데이터 멤버에 적합합니다.
html 인터뷰 질문과 경험이있는 답변
그러나 포인터 나 다른 동적 데이터 멤버의 경우 데이터가 새 메모리 위치를 가리 키기를 원합니다. 이것은 전체 복사이며 사용자 정의 복사 생성자를 사용해서 만 얻을 수 있습니다.
세 가지 유형의 생성자와 객체 생성에 대한 사용법을 모두 구현하는 완전한 C ++ 프로그램이 아래에 나와 있습니다.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; //default constructor student(){ student_id = 1; student_name = 'abc'; student_age = 10; } //parameterized constructor student(int id,string name,int age){ student_id = id; student_name = name; student_age = age; } //copy constructor student(const student& st){ student_id = st.student_id; student_name = st.student_name; student_age = st.student_age; } void print_studentInfo() { cout<<'
Student ID : '< 산출:
********** s **********
학생 ID : 1
학생 명 : abc
학생 연령 : 10 세
********** s2 **********
학생 ID : 2
학생 이름 : xyz
학생 연령 : 12 세
동일한 스크린 샷은 아래와 같습니다.
이 프로그램에서는 이전 프로그램에서 정의한 것과 유사한 반 학생을 정의했습니다. 차이점은 함수를 통해 표준 입력에서 데이터 멤버 값을 읽는 대신 세 개의 생성자를 정의한다는 것입니다.
클래스가 둘 이상의 생성자를 가질 수 있습니다. 데이터 멤버를 초기 값으로 초기화하는 기본 생성자가 있습니다. 다음으로 초기 값을 생성자에 매개 변수로 전달하는 매개 변수화 된 생성자를 정의합니다.
다음으로 학생 클래스의 객체에 대한 상수 참조를 전달하는 복사 생성자를 정의합니다.
주 함수에서는 세 개의 생성자를 사용하여 세 개의 개체를 별도로 만듭니다. 첫 번째 객체는 기본 생성자를 사용하여 생성됩니다. 두 번째 객체 s1은 매개 변수화 된 생성자를 사용하여 생성되고 세 번째 객체 s2는 복사 생성자를 사용하여 생성됩니다.
세 번째 개체 s2의 생성에 유의하십시오. 여기에서 이미 생성 된 객체 s1을 새 객체 s2에 할당합니다. 따라서 이미 존재하는 객체를 사용하여 새 객체를 생성 할 때 컴파일러에 의해 복사 생성자가 호출됩니다.
할당 연산자
할당 연산자 (=)를 사용하여 한 개체의 값을 다른 개체에 할당 할 수도 있습니다. 이 경우 s1 = s와 같은 명령문을 갖게됩니다.
복사 생성자와 할당 연산자의 차이점은 복사 생성자가 모두 새 객체를 생성하는 동안 할당 연산자는 RHS의 객체 멤버 값을 LHS의 객체 값에 할당한다는 것입니다. 이것은 할당 연산자의 양쪽에있는 객체가 할당 전에 존재해야 함을 의미합니다.
구축함
소멸자는 또한 생성자와 같은 특수 함수이지만 생성자와 정확히 반대되는 기능을 구현합니다. 생성자는 개체를 만드는 데 사용되지만 소멸자는 개체를 파괴하거나 삭제하는 데 사용됩니다.
소멸자의 일부 특성은 다음과 같습니다.
- 소멸자 이름은 클래스 이름과 동일하지만 물결표 (~) 기호로 시작합니다.
- 소멸자에는 반환 유형이 없습니다.
- 소멸자에는 인수가 없습니다.
- 클래스에는 소멸자가 하나만있을 수 있습니다.
- 컴파일러는 클래스에 대해 하나를 제공하지 못하면 항상 기본 소멸자를 만듭니다.
소멸자의 일반적인 구문은 다음과 같습니다.
~classname(){ //cleanup code }
클래스의 소멸자는 일반적으로 다음 상황에서 호출됩니다.
- 개체가 범위를 벗어나면 클래스 소멸자가 자동으로 호출됩니다.
- 마찬가지로 프로그램이 실행을 완료하면 소멸자가 호출됩니다. 이것은 모든 객체도 존재하지 않음을 의미합니다. 따라서 각 개체의 소멸자가 호출됩니다.
- 클래스의 소멸자는 객체를 삭제하는 'delete'연산자가 실행될 때도 호출됩니다.
- 객체 기능을 마친 후 소멸자를 명시 적으로 호출하여 정리 작업을 수행 할 수도 있습니다.
아래 주어진 예제는 소멸자의 작동을 보여줍니다.
#include using namespace std; class sample{ public: sample(){ cout<<'Constructor::sample called'< 산출:
Constructor :: sample 호출
이것은 샘플 클래스입니다
소멸자 :: ~ 샘플 호출
위 출력의 스크린 샷은 아래와 같습니다.
생성자, 소멸자 및 함수 디스플레이를 정의한 클래스 샘플을 정의했습니다. main 함수에서 우리는 class sample의 객체 obj를 생성 한 다음이 객체에 대한 디스플레이 함수를 호출합니다.
그 후 리턴 0이 실행됩니다. 출력에서 디스플레이 함수가 반환되고 프로그램 제어가 명령문이 0을 반환하는 순간 소멸자가 실행되는 것을 볼 수 있습니다. 이것은 객체가 범위를 벗어나는 순간 실행됨을 의미합니다.
'this'포인터
C ++는 'this'포인터라고하는 객체와 관련된 특별한 개념을 사용합니다. 'this'포인터는 항상 현재 개체를 가리 킵니다. 따라서 상황에 따라 현재 객체를 참조해야 할 때마다 'this'포인터를 사용합니다.
클래스의 인스턴스, 즉 객체가 생성 될 때마다 객체에 대해 클래스의 데이터 멤버의 별도 사본이 만들어집니다. 그러나 클래스의 멤버 함수에 관해서는 모든 객체가 동일한 사본을 공유합니다.
그렇다면 하나 이상의 객체가 멤버 함수에 동시에 액세스 할 때 멤버 함수가 적절한 데이터 멤버에 액세스하고 수정하는지 어떻게 확인할 수 있을까요?
이것은 'this'포인터가 작동하는 곳입니다. 컴파일러는 함수 이름이 'this'인 암시 적 포인터를 전달합니다. 이것을 'this'포인터라고합니다.
'this'포인터는 모든 멤버 함수 호출에 숨겨진 인수로 전달됩니다. 일반적으로 지역 변수입니다. 따라서 'this'포인터는 상수 포인터이고 그 내용은 현재 개체의 메모리 주소입니다.
이 포인터는 정적 함수가 아닌 비 정적 멤버 함수에만 사용할 수 있습니다. 객체를 사용하여 정적 함수에 액세스 할 필요가 없기 때문입니다. 클래스 이름을 사용하여 직접 액세스 할 수 있습니다.
일반적으로 동일한 이름을 공유하는 멤버 변수를 초기화하기 위해 멤버 변수와 매개 변수가 전달되는 상황에서 'this'포인터를 사용합니다. 함수에서 현재 객체를 반환해야 할 때도 사용합니다.
아래에서 'this'포인터의 데모를 보겠습니다.
#include using namespace std; class Sample { private: int num; char ch; public: Sample &setParam(int num, char ch){ this->num =num; this->ch = ch; return *this; } void printValues(){ cout<<'num = '< 산출:
숙련 된 사용자를위한 애자일 인터뷰 질문 및 답변
숫자 = 100
ch = A
위의 프로그램에는 두 개의 데이터 멤버의 num 및 ch가있는 Sample이라는 클래스가 있습니다. 멤버 변수의 값을 설정하기 위해 동일한 이름, num 및 ch를 가진 매개 변수를 전달하는 멤버 함수 setParam이 있습니다.
함수 내에서이 포인터가 나타내는 현재 개체 멤버 변수에 이러한 값을 할당합니다. 값이 설정되면 현재 개체 'this'가 함수에서 반환됩니다.
주 함수에서 먼저 Sample 클래스 인 obj의 객체를 만들고 setParam 함수를 호출하여 값을 설정 한 다음 printValues 함수를 호출하여 값을 인쇄합니다.
결론
이 튜토리얼에서는 C ++에서 OOP의 기본 구성 요소를 배웠습니다. 클래스와 객체를 이해하는 것이 우선 C ++의 OOP에 대한 기본 요구 사항입니다. 또한 예제를 통해 생성자와 소멸자에 대해 자세히 배웠습니다.
다음 자습서에서는 C ++의 이니셜 라이저 목록에 대해 알아 봅니다.
추천 도서