IT 프로그래밍/C++ 51

[c++] 순수 가상 함수, 추상 기본 클래스, 인터페이스 클래스

순수 가상 함수virtual void speak() const = 0; 부모 클래스에서 자식 클래스에 특정 함수를 만들고 싶을 때 이것을 쓰는 것입니다.  그러면 만약에 speak()를 깜빡했을 때 오류가 뜨게 되는 것입니다. 이것이 바로 순수 가상 함수를 사용하는 이유입니다. 즉 자식 클래스가 깜빡할 경우를 대비해서 경고 표시를 만들어주는 것이라고 보면 됩니다.  class를 설계할 때 구조를 도와주는 것이라고 보면 됩니다. 다이아몬드 상속문제#include #include using namespace std;class PoweredDevice{public: int m_i; PoweredDevice(int power) { cout   전체코드입니다.class PoweredDevice{public: i..

[C++] 가상 소멸자

class A{public: virtual void print() final { cout 이렇게 final을 해주면 밑에서 override를 해주지 못하도록 막아버리는 것입니다. 이렇게 뒤면 밑에 override하는 것들이 다 막히는 것을 볼 수 있습니다.  가상소멸#include using namespace std;class Base{public: ~Base() { cout 이렇게 할경우 메모리 누수가 발생하게 됩니다. Derived를 소멸자 작업을 하지 않았기 때문인데요. class Base{public: virtual ~Base() { cout 여기서 ~Base를 virtual로 만들어주면 정상적으로 자식 소멸자가 실행되고 부모클래스가 실행이 되는 것을 볼 수 있습니다.

[c++] virtual 함수

#include using namespace std;class A{public: void print() { cout 여기서 ref.print()를 하면 A가 나옵니다. B가 나올 것 같은데 A가 나오는 것을 볼 수 있으며 c를 넣어도, d를 넣어도 똑같이 A가 나옵니다.  Virtual 사용#include using namespace std;class A{public: virtual void print() { cout 하지만 virtual로 넣어주면 B가 나오는 것을 볼 수 있습니다. 이렇게 작동하는구나 라는 것을 알아두시면 됩니다.  class C : public B{public: virtual void print() { cout 이렇게 virtual 간에 타입이 다르다면 오류가 뜨는데요. return..

[c++] 상속받은 함수를 오버라이딩 하기

#include using namespace std;class Base{protected: int m_i;public: Base(int value) : m_i(value) {} void print() { cout   cout (b)이렇게 해주면 위에 있는 operator  상속받은 함수를 감추기using Base::m_i; 이것을 Derived에 넣어주면 m_i가 Derived안에서 public이 되어 버립니다. 이것이 상속된 유도 클래스에서 바꿀 수도 있습니다. class Derived : public Base{private: double m_d;public: Derived(int value) : Base(value) {} using Base::m_i;};이렇게 사용해주면 되는 것입니다. 그러면 ..

[c++] 따배시 상속과 접근 지정자

class Base{public: int m_public;protected: int m_protected;private: int m_private;};int main(){ Base base; base.m_public = 123; base.m_protected = 123;}protected는 class 밖에서 접근을 할려하니 오류가 발생합니다. base.m_protected는 불가능한데요. 당연히 private는 안되는 것을 알고 계실 것이라 생각합니다.  protected는 상속된 곳에서 접근이 되느냐 안되느냐가 public이랑 차이입니다. #include using namespace std;class Base{public: int m_public;protected: int m_protected;priv..

[따배시 11.1 c++] 상속의 기본1

Constructor를 해주는 이유는 메모리가 할당될 때 initializer를 해주기 위한 것입니다.  class Mother{public: int m_i;};class Child : public Mother{public: Child() { this -> m_i = 10; }};이렇게 상속을 받은 것을 this -> 로도 가능합니다.  상속을 받으면 자기 거가 되는 것입니다. 하지만 초기화는 불가능한데요.   class Child : public Mother{public: Child() : m_i(1024) { this -> m_i = 10; this -> Mother::m_i = 1024; }};여기서 초기화를 하면 오류가 발생합니다. 왜 초기화는 안되냐고 생각을 할 수 있습니다.   #inc..

[c++] 2702번 초6 수학

문제  코드#include #include using namespace std;int gcd(int a, int b){ if (a % b == 0) return b; return gcd(b, a % b);}int lcm(int a, int b){ return a * b / gcd(a, b);}int main(){ int n; cin >> n; int x, y; for (int i = 0; i > x >> y; cout  알고리즘 int gcd(int a, int b){ if (a % b == 0) return b; return gcd(b, a % b);}바로 gcd를 구하는 코드를 알면 쉽게 풀 수 있지만 이에 대한 코드가 모르면 갈피를 잡지 못할 수 있습니다.  유클리드 알고..

[c++] 2903번 중앙 이동 알고리즘

문제https://www.acmicpc.net/problem/2903 코드#include #include using namespace std;int n;int main(){ cin >> n; int dot = 2; while (n--) { dot = dot * 2 - 1; } cout (pow(dot, 2))  설명 주어진 도형을 잘 보면 2 * 점의 개수 -1 순으로 증가를 하는 것을 볼 수 있습니다. 이것을 바탕으로 while문을 걸어준 다음 pow(dot, 2)) 혹은 dot * dot를 출력해주시면 답은 나옵니다. 간단한 문제라 점의 개수가 어떻게 증가하는지 여부만 파악한다면 쉽게 풀 수 있는 문제였습니다. 예제 실행 흐름 만약 n = 3을 입력받으면: 1. 초기 dot = 2. 2. 첫 번째 ..

동적 메모리와 스마트 포인터

동적메모리 C++에서 NEW와 DELETE를 이용하여 동적 메모리를 관리합니다. 동적 메모리를 실수 없이 관리하는 것은 생각보다 까다롭습니다. 용도가 다한 동적 객체를 반환하지 않으면 쓰레기(garbage)가 생성되어 메모리 누수(memory leak)가 발생하고, 객체를 가리키는 포인터가 존재하는데 객체를 삭제하면 유효하지 않은 주소를 가지는 포인터가 생길 수 있습니다.  스마트 포인터 c++은 동적 메모리를 쉽고 안전하게 사용할 수 있도록 3종류의 스마트 포인터를 제공합니다. shared_ptr은 다수의 포인터가 하나의 객체를 가리키는 것을 허용합니다.unique_ptr은 가리키는 객체를 온전히 소유한다.weak_ptr은 shared_ptr이 가리키는 객체에 대한 weak reference를 제공한다..

c++ 포인터 설명

int main(){ using namespace std; int array[5] = { 9, 7, 5, 3, 1 }; cout 여기서 알 수 있듯이 array는 포인터입니다. 이렇게 array 하나만 입력하면 주소가 나오며 이는 &array[0] 참조를 이용할 때도 같은 값이 나오는 것을 볼 수 있습니다. cout 이렇게 해주면 array[0]의 값인 9가 나옵니다. char name[] = "JackJack";cout 이 경우에는 J가 나옵니다. 정적 array 또한 포인터라는 것을 알 수 있습니다.