C++ 프로그래밍
소멸자
#include<iostream> using namespace std; class ctest { private: int num; public: ctest(int n) { num = n; cout << num << " CTest 생성" << endl; } ~ctest() { cout << "CTest 소멸" << endl; } }; class ctestsub :public ctest { private: int subnum; public: ctestsub(int n, int subnum):ctest(n) // ctestsub의 매개변수로 받는 n,subnum 중 n이 ctest의 생성자로 초기화됨 { this->subnum = subnum; cout << this->subnum << " CTestSub 생성" << endl; } ~ctestsub() { cout << "CTestSub 소멸" << endl; } }; int main() { ctest c(10); ctestsub s(1,10);//1,10 --> 1이 ctest의 num으로, 10이 ctestsub의 subnum으로 들어감 return 0; }
가상 소멸자
#include<iostream> using namespace std; class ctest { private: int num; public: ctest(int n) :num(n) { cout << num << " CTest constructor" << endl; } virtual ~ctest() // 가상함수로 선언시에 소멸될때 호출되고 ~ctest()로 선언 시 호출 안됨 { cout << "CTest destrcutor" << endl; } void func() { cout << "CTest func()" << endl; } virtual void vfunc()//가상함수 { cout << "CTest vfunc()" << endl; } }; // 가상 소멸자를 사용하면 기본 클래스의 소멸자가 호출되면 // 파생 클래스의 소멸자도 호출되도록 보장할 수 있습니다. class ctestsub :public ctest { private: int snum; public: ctestsub(int n1, int n2) :ctest(n1), snum(n2) { cout << snum << " CTestSub constructor" << endl; } ~ctestsub() { cout << "CTestSub destructor" << endl; } void vfunc() { cout << "CTestSub func()" << endl; } }; int main() { /*ctest c1(10); cout << "=========" << endl; ctestsub c2(1, 10); cout << "========" << endl;*/ ctest* ps = new ctestsub(3, 33); delete ps; return 0; }
참조와 가상함수
#include <iostream> using namespace std; class First { public: void FirstFunc() { cout << "FirstFunc()" << endl; } virtual void SimpleFunc() { cout << "First's SimpleFunc()" << endl; } }; class Second : public First { public: void SecondFunc() { cout << "SecondFunc()" << endl; } virtual void SimpleFunc() { cout << "Second's SimpleFunc()" << endl; } }; class Third : public Second { public: void ThirdFunc() { cout << "ThirdFunc()" << endl; } virtual void SimpleFunc() { cout << "Third's SimpleFunc()" << endl; } }; int main(void) { Third obj; obj.FirstFunc();//상속하고있는 상위 클래스의 메소드에 접근 가능 obj.SecondFunc(); obj.ThirdFunc(); obj.SimpleFunc(); Second& sref = obj; sref.FirstFunc(); sref.SecondFunc(); sref.SimpleFunc();//simpleFunc는 가상함수로 선언되어있어 처음 생성된 객체 기준 First& fref = obj; fref.FirstFunc(); fref.SimpleFunc(); return 0; }
Operator
#include<iostream> #include<cstring> using namespace std; class myclass { int num1, num2; const char* name; public: myclass(int anum1=0, int anum2=0, const char* aname=nullptr) :num1(anum1), num2(anum2), name(aname) {} void showdata() { cout << num1 << " " << num2 << " " << name << endl; } }; int main() { cout << "=============" << endl; myclass c(10, 20, "오윤범"); c.showdata(); cout << "=============" << endl; myclass cm(c); // c객체의 정보를 담는 myclass cm 객체 생성 cm.showdata(); cout << "=============" << endl; myclass cm1; cm1 = cm; // 객체끼리 대입연산 가능 cm1.showdata(); return 0; }
Operator (클래스끼리 더하기)
#include <iostream> using namespace std; class Point { private: int xpos, ypos; public: Point(int x = 0, int y = 0) : xpos(x), ypos(y) { } void ShowPosition() const { cout << '[' << xpos << ", " << ypos << ']' << endl; } Point operator+(const Point& ref) //operator+라는 이름의 함수 { Point pos(xpos + ref.xpos, ypos + ref.ypos); return pos; } }; int main(void) { Point pos1(3, 4); Point pos2(10, 20); Point pos3 = pos1.operator+(pos2); // pos1과 pos2의 xpos,ypos값을 더함 pos1.ShowPosition(); pos2.ShowPosition(); pos3.ShowPosition(); return 0; }
함수 포인터
#include<iostream> using namespace std; int add(int n1, int n2) { return n1 + n2; } int sub(int n1, int n2) { return n1 - n2; } int main() { int res; int (*fp)(int, int);//함수포인터 선언 fp = add; res = fp(10, 20); cout << "add====" << endl; cout << res << endl; fp = sub; res = fp(10, 20); cout << "sub====" << endl; cout << res; return 0; }
프로그래머스
순서쌍의 개수
def solution(n): answer = 0 for i in range(1,n+1): if n%i==0: answer+=1 return answer solution(100)
--> 순서쌍의 개수 = 약수의 개수 임을 알고 모르고의 차이가 문제풀이에 큰 차이를 가져옴