반응형

IT 프로그래밍/객체지향프로그래밍 57

상속이란?

컴퓨터라는 클래스가 있다고 가정을 해봅시다. 그리고 노트북이라는 클래스를 만들고 싶을 때 일반적인 컴퓨터의 속성을 가지고 있을 것입니다. 유사성이 비슷한 두 클래스이지만 screen size와 weight같은 특수한 노트북의 속성들이 추가적으로 필요할 것입니다.  하지만 상속을 이용하면 더 간단하게 이용할 수 있습니다. 상속컴퓨터로부터 derived된 클래스라고 표현을 하며 컴퓨터는 base 클래스, 확장해서 만든 클래스를 derived 클래스라고 합니다. 이 관계는 is a relationship이라고 부릅니다. A notebook is a computer라고 부릅니다.   class Computer {public: string manufacturer; string processor; int ramSi..

컴파일 과정

컴파일 단계에서 이해 #include using namespace std;class Foo;class Bar {public: Bar(); Bar(Foo f); Foo* bar_func(int x);};int some_func();int some_func2(Foo f);int main() { Bar b; Foo* p_foo = b.bar_func(10); int result = some_func(); return 0;}Foo 타입의 객체를 생성하거나 그런 부분은 없습니다. 컴파일 되기 위해서는 이름만 필요로 하기 때문에 컴파일 단계에선 forward declaration만으로 충분하다는 것입니다.  실제적인 정의는 다른 파일에 있을 것이라고 가정을 하는 것이빈다. 이것이 링커의 몫인 것입니다.  즉 cla..

복사생성자

변수 선언하면서 초기화할 때 이외에도 복사 생성자가 실행되는 경우값에 의한 호출로 매개변수를 전달할 때함수가 값에 의한 반환을 할 때배열 혹은 벡터의 원소들을 중괄호로 초기화할 때치환문에서 Deep copy 원한다면 = 오버로딩Bar& operator=(const Bar& t) { clearMembers(); ptr = new Foo(*t.ptr); for (auto& pt : t.vec) vec.push_back(new Foo(*pt)); return *this;}자신과 동일한 타입의 객체를 받으려면 const로 받아야 합니다. 이는 규칙으로 이해해주시면 됩니다.  private: void clearMembers() { delete ptr; for (auto p : vec) delete p; ..

객체의 복사와 삭제

#include #include #include #include using namespace std;class MyRectangle {public: MyPoint* lu; double width, height; MyRectangle() = default; MyRectangle(double x, double y, double w,double h): lu(new MyPoint(x, y)), width(w), height(h){}};MyRectangle r(1, 2, 3, 4);MyRectangle q = r;r.lu->x = 100;cout x c++에서 객체를 복사하면 멤버별 복사가 일어나빈다. 객체 r의 멤버 lu는 MyPoint객체의 주소이므로 그 주소가 객체 q의 멤버 lu로 복사고딥니다.  그 결..

다항식 계산기 (code12. cpp 수정

void add_term(int coef, int expo) { auto it = terms.begin(); while (it != terms.end() && (*it)->expo > expo) it++; if (it != terms.end() && (*it)->expo == expo) { (*it)->coef += coef; if ((*it)->coef == 0) { terms.erase(it); } else { terms.insert(it, new Term(coef, expo)); } }}이 경우에 erase 되지만 이것은 garbage가 됩니다. 삭제를 해주기 위해선 delete를 해주면 되는데요. 이 객체의 주소를 표현해야 하기 때문에delete *it;이렇게 해주면 garbag..

동적 생성 개체의 삭제와 쓰레기

동적 객체는 delete를 해줘야한다동적 생성된 객체는 명시적으로 delete를 해줘야 삭제가 됩니다. 다른 객체들은 그 객체의 scope를 벗어나면 자동 삭제되지만 동적 생성은 아닙니다.  그러므로 반드시 delete를 해주어야 하는데요. 동적 생성된 객체의 주소를 저장하는 포인터는 그 포인터 변수의 scope를 벗어나면 자동 삭제됩니다. 이 경우 동적 생성된 객체의 주소를 잃어버리게 됩니다. 이렇게 주소를 잃어버리고 삭제되지 않은 동적 객체를 쓰레기라고 부릅니다. 이 누적된 쓰레기는 프로그램의 성능을 저하시킵니다.  class MyPoint {public: double x, y; MyPoint() = default; MyPoint(double a, double b) : x(a), y(b) {}};in..

동적 객체 생성 new 연산자

지금까지 데이터는 항상 이름이 가진 객체에 저장을 하였습니다. 하지만 C++에서는 NEW 연산자로 이름이 없는 객체를 생성할 수 있습니다. 이름이 없으면 그 객체를 어떻게 사용할까요? NEW 연산자이름이 없는 대신 new 연산자는 생성된 객체의 주소를 반환합니다.그 주소를 포인터에 저장하여 간접참조를 통해 객체를 사용할 수 있습니다. 일반적으로 동적 생성된 객체는 메모리에서 힙이라고 부르는 영역에 저장됩니다. 동적으로 생성된 객체는 명시적으로 delete해주지 않으면 자동 삭제되지 않습니다. 해당 구조로 데이터가 컴퓨터에 저장되어 있습니다. Data section에는 전역변수들이 저장됩니다. 전역변수는 지역변수와는 달리 프로그램이 시작되는 시점에 데이터가 생성되고 완전히 종료될 때까지 유지하고 있는 변수..

[C++]연산자 오버로딩

Delegation bool operator==(Date& rhs) { return year == rhs.year && month == rhs.month && day == rhs.day; } bool operator !=(Date& rhs) { return !(*this == rhs); }delegation 한 것을 볼 수 있습니다.  #include #include #include #include #include using namespace std;class Date {private: int year, month, day; vector short_months{ 4, 6, 9, 11 }; bool is_short_month() { return find(short_months.begin(), shor..

[C++] 다항함수 계산기 [5-2]

다항함수 계산기 C++#include #include #include #include using namespace std;class Term { friend class Polynomial;private: int coef; int expo; Term() = default; Term(int c, int e) : coef(c), expo(e) {}public: int calc(int x) { return coef * pow(x, expo); } void print(ostream& out) { out terms;public: Polynomial() = default; Polynomial(char pname) : name(pname) {} char get_name() { return name; } void..

객체지향프로그래밍 그룹액티비티 6

객체지향프로그래밍 1-1#include using namespace std;void fun(int* ptr) { *ptr = 30;}int main(){ int y = 20; fun(&y); cout y값이 30으로 변경되고 출력은 30이 됩니다.  객체지향프로그래밍 1-2 #include using namespace std;int main() { int* ptr; int x; ptr = &x; *ptr = 0; cout 포인터를 사용하여 변수의 값을 제어하는 간단한 것입니다.  먼저 포인터와 변수를 설ㅇ정해주었는데요. ptr은 정수를 가리키는 포인터이며 x는 정수형 변수입니다.  ptr = &x; 을 통해 ptr에 x의 주소를 저장함으로서 이제 ptr은 x를 가리키게 됩니다. *ptr = 0은 ptr이..

반응형