지난 수업에서 "클래스는 객체의 추상화와 일반화이고, 객체는 클래스의 구체성과 인스턴스이다"라는 문장을 아직도 기억하시나요? 클래스 정의를 학습한 후 다음 단계는 객체를 생성하고 사용하는 것 입니다!
1. 객체 생성:
클래스는 함수를 포함하는 구조체입니다. 객체인 변수를 정의하는 데 사용됩니다. 소위 "객체는 클래스의 인스턴스입니다." 이 클래스가 정의되면 객체를 인스턴스화한다고 할 수도 있습니다. 이것이 바로 의미입니다!
객체의 사용은 구조의 사용과 동일하며 주로 내부 멤버에 액세스하며 다음과 같이 모두 를 사용하여 액세스합니다 .
StudentA;A.num=101;strcpy(A.name,dotcpp);A.score=100;A.print();
여기서 주의할 점은 클래스의 멤버 변수는 모두 public 유형 으로 선언되어 있으며, private 유형으로 선언한 경우 주로 main 함수의 객체 및 변수를 통해 직접 액세스하는 경우 오류 보고가 금지됩니다. 이유는 개인 유형 변수가 개인 유형이고 외부 액세스를 허용하지 않기 때문입니다.
보호하고 싶지만 제어하고 싶은 비공개 변수의 경우 일반적으로 비공개 유형으로 선언한 다음 동시에 공개 유형의 특수 할당 방법을 정의합니다. 내부 멤버는 비공개로 선언된 변수에 액세스할 수 있으므로 이를 사용할 수 있습니다. public은 캡슐화 및 보호 효과를 얻기 위해 이러한 private 멤버를 간접적으로 제어하는 메소드이며, 이 public 유형 메소드를 이 클래스의 외부 인터페이스 라고도 합니다. 이 문장을 이해해주세요!
2. 객체에 대한 포인터:
일반 변수와 마찬가지로 객체도 연속적인 메모리 공간이므로 객체에 대한 포인터, 즉 객체 포인터를 만들어 객체의 주소를 저장할 수도 있습니다.
그러면 생성방법은 일반형 포인터를 사용하는 것과 유사하며 정의방법은 다음과 같다.
클래스 이름 * 포인터 이름;
예를 들어, Student *p를 정의하고, Clock 유형의 포인터 p를 정의합니다. 여기서 객체가 생성되지 않으며 생성자가 호출되지 않는다는 것이 분명해야 합니다. 다음으로 이 포인터에 동일한 유형의 클래스 개체의 주소를 할당한 다음 ->를 통해 개체의 멤버에 액세스할 수 있습니다.
코드는 다음과 같습니다:
Student*p;StudentA;p=&A;p->print();
위는 객체 포인터를 사용하는 방법입니다. 값을 할당하고 멤버에 액세스할 때 사용하는 것 외에도 매개 변수를 전달할 때 포인터를 사용하는 것이 좋습니다. 주소를 전달하고 객체 간 할당을 복사하지 않으므로 메모리 오버헤드가 줄어들기 때문입니다. 효율성을 향상시킵니다.
3. 개체 참조:
참조는 C++의 새로운 유형입니다. 객체 참조는 클래스 객체의 별칭입니다. 본질적으로 클래스 객체의 주소는 둘 다 메모리 공간을 가리킵니다. 그렇다면 용도를 어떻게 정의해야 할까요? 아래에서 보여주세요.
학생A;학생&Aq=A;
위 코드에서 볼 수 있듯이 Student 유형의 객체를 정의한 다음 &를 사용하여 이 유형의 참조 유형을 정의하고 A 객체를 Aq에 초기화로 할당합니다.
참고할 사항은 다음과 같습니다.
1. 포인터와 마찬가지로 둘 다 참조되기 전에 동일한 유형이어야 합니다.
2. 함수의 반환값이나 형식적인 매개변수를 사용하지 않는 이상, 다른 참조타입도 동시에 초기화해야 합니다!
3. 참조 유형은 새 객체를 생성하지 않으므로 생성자가 호출되지 않습니다.
따라서 클래스 객체의 별칭이므로 사용 방법은 클래스 객체와 동일하며 다음과 같이 alias.member 메소드를 사용하여 액세스합니다.
StudentA;Student&Aq=A;Aq.print();
보시다시피 참조 유형을 사용할 때 본질은 여전히 저장된 주소입니다. 따라서 매개변수 정의에 관계없이 메모리 오버헤드가 너무 많지 않습니다. 동시에 포인터의 장점도 있습니다. 클래스 객체 자체와 동일하게 사용됩니다. 함수 인수를 만들 때 주소 문자를 추가하지 않고 참조 객체를 직접 전달하면 더 직관적이고 편리해 보입니다. 이것이 참조 유형의 장점입니다.