제 5 장생성자와접근제어 1. 객체지향기법을이해한다. 2. 클래스를작성할수있다. 3. 클래스에서객체를생성할수있다. 4. 생성자를이용하여객체를초기화할수 있다. 5. 접근자와설정자를사용할수있다.
이번장에서만들어볼프로그램
생성자 생성자 (constructor) 는초기화를담당하는함수
생성자가필요한이유 #include <iostream> using namespace std; class Time { public: int hour; // 시를나타낸다. 0-23 가가능하다. int minute; // 분을나타낸다. 0-59 가가능하다. ; void print() { cout << hour << ":" << minute << endl; Time a; // 객체 a 를생성한다. a.hour = 26; a.minute = 70;
생성자의예 class Time { public: int hour; // 0-23 int minute; // 0-59 ; Time(int h, int m) { hour = h; minute = m; void print() { cout << hour << ":" << minute << endl;
생성자를호출하는방법 Time a; // 1 오류이다! 초기화값이없다! Time b(10, 25); // 2 OK 하지만예전의방법이다. Time c { 10, 25 ; // 3 OK 최신의방법이다. Time d = { 10, 25 ; // 4 OK 하지만간결하지않다.
생성자의중복정의 #include <iostream> using namespace std; class Time { public: int hour; // 0-23 int minute; // 0-59 ; Time() { hour = 0; minute = 0; Time(int h, int m) { hour = h; minute = m; void print() { cout << hour << ":" << minute << endl;
디폴트생성자 #include <iostream> using namespace std; class Time { public: int hour; // 0-23 int minute; // 0-59 ; Time(int h=0, int m=0) { hour = h; minute = m; void print() { cout << hour << ":" << minute << endl;
디폴트생성자 int main() { Time a; Time b{ 10, 25 ; // OK // OK a.print(); b.print(); return 0;
멤버초기화리스트 Time(int h, int m) : hour{h, minute{m { Time(int h, int m) : hour(h), minute(m) { Time(int h=0, int m=0) : hour{h, minute{m {
소멸자
소멸자 #include <string.h> class MyString { private: char *s; int size; public: MyString(char *c) { size = strlen(c)+1; s = new char[size]; strcpy(s, c); ~MyString() { delete[] s; ; int main() { MyString str("abcdefghijk");
Lab: Rect 클래스 사각형을나타내는 Rectangle 클래스에생성자를추가해보자.
solution #include <iostream> using namespace std; class Rectangle { int width, height; public: Rectangle(int w, int h); int calcarea(); ; Rectangle::Rectangle(int w, int h) { width = w; height = h; int Rectangle::calcArea() { return width*height;
solution int main() { Rectangle r{ 3, 4 ; cout << " 사각형의넓이 : " << r.calcarea() << '\n'; return 0;
Lab: Circle 클래스 원을나타내는 Circle 클래스를작성하여보았다. 원은중심점과반지름과색상으로표현된다. 약 10 개의 Circle 객체를생성하면서랜덤한위치와랜덤한반지름으로화면에원을그려보자. 원의중심점과반지름은생성자를호출하여설정하라
Circle::Circle(int xval, int yval, int r, string c) { x = xval; y = yval; radius = r; color = c; solution #include <windows.h> #include <iostream> using namespace std; class Circle { int x, y, radius; string color; public: Circle(int xval = 0, int yval = 0, int r = 0, string c = ""); double calcarea(){ return radius*radius*3.14; void draw(); ;
예제 class Time { private: // 이후에선언되는멤버는모두전용멤버가된다. int hour; // 0-23 int minute; // 0-59 public: Time(int h, int m); void inc_hour(); void print(); ; Time::Time(int h, int m) { hour = h; minute = m; void Time::inc_hour() { ++hour; if (hour > 23) hour = 0;
예제 Time a { 24, 59 ; ++a.hour; // 이제는오류가발생한다!!
접근제어
접근자와설정자
예제 #include <iostream> using namespace std; class Time { public: Time(int h, int m); void inc_hour(); void print(); int gethour() { return hour; int getminute() { return minute; void sethour(int h) { hour = h; void setminute(int m) { minute = m; private: ; int hour; // 0-23 int minute; // 0-59
예제 int main() { Time a{ 0, 0 ; a.sethour(6); a.setminute(30); a.print(); return 0;
Lab: 원들의경주 지금까지학습한내용을바탕으로 원들의경주 게임을다시작성하여보자. 두개의원을생성한후에난수를발생하여원들을움직인다.
Solution #include <iostream> #include <windows.h> using namespace std; class Circle { public: Circle(int xval, int yval, int r); void draw(); void move(); private: int x, y, radius; ; Circle::Circle(int xval, int yval, int r) : x{ xval, y{ yval, radius{ r {
void Circle::draw() { Solution HDC hdc = GetWindowDC(GetForegroundWindow()); Ellipse(hdc, x - radius, y - radius, x + radius, y + radius); void Circle::move() { x += rand() % 50; int main() { Circle c1{ 100, 100, 50 ; Circle c2{ 100, 200, 40 ; for (int i = 0; i < 20; i++) { c1.move(); c1.draw(); c2.move(); c2.draw(); Sleep(1000); return 0;
객체와함수 객체가함수의매개변수로전달되는경우 객체의참조자가함수의매개변수로전달되는경우 함수가객체를반환하는경우
객체가함수의매개변수로전달되 는경우 값을전달한다. 어떤피자체인점에서미디엄크기의피자를주문하면무조건라지피자로변경해준다고하자. 다음과같이프로그램을작성하면피자의크기가커질까?
#include <iostream> using namespace std; class Pizza { public: Pizza(int s) : size(s) { int size; ; // 단위 : 인치 void makedouble(pizza p){ p.size *= 2; int main(){ Pizza pizza(10); makedouble(pizza); cout << pizza.size << " 인치피자 " << endl; return 0;
실행결과
객체의참조자가함수의매개변수 #include 로전달되는 <iostream> 경우 using namespace std; class Pizza { public: Pizza(int s) : size(s) { int size; ; // 단위 : 인치 void makedouble(pizza& p) { p.size *= 2; int main() { Pizza pizza(10); makedouble(pizza); cout << pizza.size << " 인치피자 " << endl; return 0;
실행결과
함수가객체를반환하는경우 함수가객체를반환할때도객체의내용이복사될뿐원본이전달되지않는다.
예제 #include <iostream> using namespace std; class Pizza { public: Pizza(int s) : size(s) { int size; ; // 단위 : 인치 Pizza createpizza() { Pizza p(10); return p; int main() { Pizza pizza = createpizza(); cout << pizza.size << " 인치피자 " << endl; return 0;
실행결과
Q & A