포인터로 멤버를 접근할 떄
- 객체포인터 -> 멤버
#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;
}
객체 배열
객체 배열 생성시 기본생성자가 자동으로 호출되는데 생성자에 매개변수가 있는 생성자가 1개밖에 없는 경우에는 반드시 기본 생성자를 써주어야 한다!
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
void setRadius(int r) { radius = r; }
double getArea();
};
double Circle::getArea() {
return 3.14 * radius * radius;
}
int main() {
Circle circleArray[3];
//처음에는 다들 기본 생성자 radius변수의 값 1을 가졌으나
circleArray[0].setRadius(10); //다시 radius를 설정하여 10으로
circleArray[1].setRadius(20);//다시 radius를 설정하여 20으로
circleArray[2].setRadius(30);//다시 radius를 설정하여 30으로 변경
for (int i = 0; i < 3; i++)
cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl;
Circle* p;
p = circleArray;
for (int i = 0; i < 3; i++) {
cout << "Circle " << i << "의 면적은 " << p->getArea() << endl;
p++;
}
return 0;
}
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
void setRadius(int r) { radius = r; }
double getArea();
};
double Circle::getArea() {
return 3.14 * radius * radius;
}
int main() {
//간단히 한꺼번에 선언하고 생성자에 값 넣어주기!
Circle circleArray[3] = { Circle(10),Circle(20),Circle() };
Circle* p;
p = circleArray;
for (int i = 0; i < 3; i++) {
cout << "Circle " << i << "의 면적은 " << p->getArea() << endl;
p++;
}
return 0;
}
동적할당
new - 메모리 동적 할당
delete - 메모리 반환
반드시 new로 생성시에는 delete로 반환해주어야 한다 그렇지 않으면 메모리 누수가 일어날수 있다.
(1) 기본타입
#include <iostream>
using namespace std;
int main() {
int* p;
p = new int;
//p가 NULL이면 메모리 할당 실패 : 반드시 써주어야 한다!
if (!p) {
cout << "메모리를 할당할 수없습니다.";
return 0;
}
*p = 5;
int n = *p;
cout << "*p = " << *p << endl;
cout << "n = " << n << endl;
delete p;
return 0;
}
(2) 배열의 동적할당
#include <iostream>
using namespace std;
int main() {
cout << "입력할 정수의개수는? : ";
int n;
cin >> n;
if (n <= 0) return 0;
int* p = new int[n];
if (!p) {
cout << "메모리를 할당할 수 없습니다. ";
return 0;
}
for (int i = 0; i < n; i++) {
cout << i + 1 << "번쨰 정수 : ";
cin >> p[i];
}
int sum = 0;
for (int i = 0; i < n; i++)
sum += p[i];
cout << "평균 = " << sum / n << endl;
delete[] p;
return 0;
}
ex) 정수 공간 5개를 배열로 동적할당받고, 정수 5개를 입력받아 양수가 몇개있는지 출력하고 출력후 배열을 소멸시키도록하는 main()함수를 작성하시오
#include <iostream>
using namespace std;
int main() {
int* p = new int[5];
if (!p) {
cout << "메모리를 할당할 수 없습니다. ";
return 0;
}
for (int i = 0; i < 5; i++) {
cout << i + 1 << "번쨰 정수 : ";
cin >> p[i];
}
int count = 0;
for (int i = 0; i < 5; i++) {
//포인터로 사용할 때
//if (*(p+i) > 0) {
// count++;
// }
//배열로 사용할 때
if (p[i] > 0) {
count++;
}
}
cout << "양수의 개수는 " << count << "입니다. ";
delete[] p;
return 0;
}
(3) 객체에 동적할당
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle();
Circle(int r);
~Circle();
void setRadius(int r) { radius = r; };
double getArea();
};
Circle::Circle() {
radius = 1;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() {
cout << "소멸자 실행 radius = " << radius << endl;
}
int main() {
Circle* p, *q;
p = new Circle;
q = new Circle(30);
cout << p->getArea() << endl << q->getArea() << endl;
delete p;
delete q;
return 0;
}
(4) 객체 배열에 동적할당
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle();
~Circle() {};
void setRadius(int r) { radius = r; };
double getArea() { return 3.14 * radius * radius; }
};
Circle::Circle() {
radius = 1;
}
int main() {
cout << "생성하고자 하는 원의 개수 ?";
int n, radius;
cin >> n;
Circle* pArray = new Circle[n];
for (int i = 0; i < n; i++) {
cout << "원" << i + 1 << ":";
cin >> radius;
pArray[i].setRadius(radius);
}
int count = 0;
Circle* p = pArray;
for (int i = 0; i < n; i++) {
cout << p->getArea() << " ";
if (p->getArea() >= 100 && p->getArea() <= 200)
count++;
p++;
}
cout << endl << "면적이 100에서 200사이인 원의 개수는 " << count;
delete[]pArray;
return 0;
}
동적할당 초기화
동적할당 초기화시 배열은 초기화 불가능
종합 예제!
다음과 같이 원을 추상화한 Circle 클래스가 있다.
circle.h , circle.cpp, main.cpp 3개의 파일을 작성하자.
circle.h에는 클래스 선언, circle.cpp에는 클래스를 구현하고
main.cpp에서 3개의 Circle 객체를 가진 배열을 선언하고 반지름 값을 입력받고
반지름이 10보다 큰 원의 개수를 출력하는 프로그램을 완성하라.
class Circle{
int radius;//원의 반지름
public:
void setRadius(int radius); //반지름 설정
int getRadius();//반지름 리턴
};
실행 결과는 다음과 같다.
원의 개수 >> 4
원 1의 반지름 >> 5
원 2의 반지름 >> 15
원 3의 반지름 >> 20
원 4의 반지름 >> 8
면적이 100보다 큰 원은 2개 입니다.
circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle {
private:
int radius;
public:
void setRadius(int radius);
int getRadius();
};
#endif
circle.cpp
#include <iostream>
#include "circle.h"
using namespace std;
void Circle::setRadius(int radius) {
this->radius = radius;
}
int Circle::getRadius() {
return this->radius;
}
main.cpp
#include <iostream>
#include "circle.h"
using namespace std;
int main() {
cout << "원의 개수 ";
int n, radius;
cin >> n;
Circle* pArray = new Circle[n];
for (int i = 0; i < n; i++) {
cout << "원" << i + 1 << "의 반지름 ";
cin >> radius;
pArray[i].setRadius(radius);
}
int count = 0;
Circle* p = pArray;
for (int i = 0; i < n; i++) {
if (p->getRadius() >= 10)
count++;
p++;
}
cout << endl << "면적이 100보다 큰 원은 " << count << "개 입니다.";
delete[]pArray;
return 0;
}
'Programming > C++' 카테고리의 다른 글
C++ 문자열 string 실습 (0) | 2021.04.20 |
---|---|
C++ 동적할당 실습 문제 (0) | 2021.04.20 |
C++ 클래스 (0) | 2021.04.15 |
C++ 문자열 배열 실습문제 (0) | 2021.04.15 |
C++ 포인터 배열 실습문제 (0) | 2021.04.15 |
댓글