객체에 대한 포인터
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 타입의 배열 선언
객체 배열 선언
#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
생성자 소멸자 또한 1차원 배열과 동일