객체 포인터와 객체 배열

shinyeongwoon·2022년 11월 22일
0

C++

목록 보기
1/10

객체 포인터

  • 객체에 대한 포인터
    c 언어의 포인터와 동일
    객체의 주소 값을 가지는 변수

  • 포인터로 멤버를 접근할때
    객체포인터 -> 멤버

//객체 생성
Circle donut;
//객체의 맴버 접근은 . 를 사용하여 접근
double d = donut.getArea();

//객체 포인터 변수 선언
Circle *p;
//객체 포인터 변수에 객체의 주소(&)담기
p = &donut;
//p => 객체의 주소, 주소를 이용한 접근 시 -> 를 사용하여 맴버 접근
d = p -> getArea();

예제 )

#include <iostream>

using namespace std;

class Circle{
  int radius;
public:
  Circle() { radius = 1; }
  Circle(int r){ radius = r;}
  double getArea();
}

double Circle::getArea(){
  return 3.14 * radius*radius;
}

int main(){
  Circle donut;
  Circle pizza(30);

  cout << donut.getArea() << endl;

  Circle *p;
  p = &donut;
  cout << p -> getArea() << endl;
  cout << (*p).getArea() << endl;

  p = &pizza;
  cout << p -> getArea() << endl;
  cout << (*p).getArea() << endl;

}

결과 )
3.14
3.14
2826
2826

📌 포인터 변수를 가지고 맴버에 접근하기 위해 -> 사용
포인터 변수의 값(주소, *p)를 가지고 멤버에 접근하려면 . 를사용
📎 포인터 변수의 *p를 사용하려면 ()로 감싸줘야 한다. (*p)

객체 배열, 생성 및 소멸

  • 객체 배열 선언 가능
    기본 타입 배열 선언과 형식 동일
    int n[3]; // 정수형 배열 선언
    Circle c[3]; // Circle 타입의 배열 선언

  • 객체 배열 선언

  1. 객체 배열을 위한 공간 할당
  2. 배열의 각 원소 객체마다 생성자 실행
    ex) Circle c[3]; ==> c[0],c[1],
    c[2]의 생성자 실행
    매개 변수 있는 새성자를 호출할 수 없음
    Circle circleArray[3](5); //오류
  • 배열 소멸
    배열의 각 객체마다 소멸자 호출. 생성의 반대순으로 소멸
    c[2] 소멸자,c[1] 소멸자,c[0] 소멸자 순으로 실행
#include <iostream>

using namespace std;

//Circle 객체
class Circle{
  int radius;
public:
  //기본 생성자
  Circle() { radius = 1; }
  //인자를 하나 가진 생성자
  Circle(int r){ radius = r;}
  void setRedius(int r) {radius = r;}
  double getArea();
}

//Circle class의 getArea 함수
double Circle::getArea(){
  return 3.14 * radius*radius;
}

int main(){
  // Circle type을 3개 담을 수 있는 크기의 배열 생성
  Circle cArray[3];
 
  //배열의 값으로 접근
  cArray[0].setRadius(10);
  cArray[1].setRadius(20);
  cArray[2].setRadius(30);

  //값으로 접근이기 때문에 . 를 사용하여 멤버에 접근
  for(int i = 0; i < 3; i++){
    cout << "Circle" << i << "의 면적" << cArray[i].getArea() << endl;
  }
	
  // 포인터 변수 생성
  Circle *p;
  // 배열의 변수명에는 배열의 맨 앞 요소의 주소를 담고 있으므로 포인터 변수에 대입할 수 있다.
  p = cArray;
  //포인터 변수를 이용한 접근이기 때문에 -> 를 사용하여 멤버에 접근
  for(int i = 0 ; i < 3; i++){
    cout << "Circle" << i << "의 면적" << p->getArea() << endl;
    // ++ 연산자를 이용하여 배열의 주소를 다음 index로 변경
    p++;
  }

}

실행 결과
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 2826
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 2826

#include <iostream>

using namespace std;

//생성자가 선언 되어 있지 않은 class
class Circle{
  int radius;
public:
  //자동으로 기본 생성자 생성, 컴파일 오류 발생 되지 않음
  double getArea();
}

double Circle::getArea(){
  return 3.14 * radius*radius;
}

int main(){
  Circle cArry[3];
}
#include <iostream>

using namespace std;

class Circle{
  int radius;
public:
  //인자를 가지고 있는 생성자가 있는경우 기본 생성자를 생성해 주지 않음
  Circle(int r){ radius = r; }
  double getArea();
}

double Circle::getArea(){
  return 3.14 * radius*radius;
}

int main(){
  //에러 뜨지 않음 Circle(int r) 생성자 호출
  Circle waffle(15);
  //기본 생성자가 생성 되지 않음으로 Error 발생
  Circle cArry[3];
}

객체 배열 초기화 방법

Circle cArry[3] = {Circle(10),Circle(20),Circle()};

cArry[0] : 객체게 생성 될 때 , 생성자 Circle(10)호출
cArry[1] : 객체게 생성 될 때 , 생성자 Circle(20)호출
cArry[2] : 객체게 생성 될 때 , 생성자 Circle(30)호출

#include <iostream>

using namespace std;

class Circle{
  int radius;
public:
  Circle() {radius = 1;}
  Circle(int r){ radius = r; }
  void setRedius(int r) {radius = r;}
  double getArea();
}

double Circle::getArea(){
  return 3.14 * radius*radius;
}

int main(){
  Circle cArry[3] = {Circle(10),Circle(20),Circle()};
  for (int i = 0; i < 3; i++)
  {
    cout << "Circle" << i << "면적은" << cArry[i].getArea() << endl;
  }
  
}

결과)
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 3.14

객체 배열은 2차원 배열도 가능

생성자 소멸자 또한 1차원 배열과 동일

0개의 댓글