본문 바로가기
Programming/C++

C++ 객체 포인터 선언 및 활용

by ahhang0k 2021. 4. 19.

포인터로 멤버를 접근할 떄 

- 객체포인터 -> 멤버

#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

댓글