no image
[C++] 클래스
객체, 클래스, 인스턴스객체 : 변수들과 그와 관련된 메서드들이 모인 하나의 집합체클래스 : C의 구조체에서 확정된 변수, 객체, 함수를 포함한 하나의 틀인스턴스 : 클래스를 기반으로 한 변수접근 제어 지시자public : 외부 접근 허용protected : 외부 접근 차단, 파생 클래스에서의 접근 허용private : 외부 접근 차단(default)기본 문법class CTest{public: int m_nData; void Func(void) { }};생성자와 소멸자반환 자료형이 없음호출는 함수가 아니라 적절한 시기에 내부에서 자동으로 호출되는 함수생략할 수 있으나 생략할 경우 컴파일러가 만들어 넣음생성자는 다중 정의가 가능하나 소멸자는 불가능소멸자는 앞에 ~가 붙음생성자 멤버변수..
2024.06.25
no image
[C++] 스마트 포인터
동적 할당된 인스턴스를 자동으로 삭제해주는 편리한 포인터auto_ptr동적 할당된 인스턴스를 자동으로 삭제편리하지만 모든 메모리 관리 문제를 해결하지 못할 수 있음int main() { { // 속한 범위를 벗어나면 자동 소멸 auto_ptr ptrTest(new CMyData); } return 0;}shared_ptr포인팅 횟수를 계수해서 0이 되면 삭제필요에 따라 삭제하는 로직을 추가int main() { shared_ptr ptr1(new CMyData); { shared_ptr ptr2(ptr1); } return 0;}unique_ptr한 대상을 오로지 한 포인터로만 포인팅얕은 복사를 문법으로 차단weak_ptr
2024.06.04
no image
[C++] 템플릿
함수 템플릿함수를 찍어내는 모양자templateT add(T a, T b) { return a + b; }클래스 템플릿클래스를 찍어내는 모양자템플릿으로 만들어진 클래스를 템플릿 클래스라고 함자료형이 달라서 다중정의 하게 되는 경우에 사용// T는 자료형이 됨templateclass CTest {public: CTest() {} ~CTest() {}private: T m_nData;};int main() { CTest a; return 0;}템플릿 특수화특수 경우에 예외적으로 처리하기 위함 ex) 합산에서 자료형이 int, double이 아닌 char*인 경우typename을 기술하지 않음templateT add(T a, T b) { return a + b; }templatech..
2024.06.04
no image
[C++] 관계
수평클래스들간의 관계에서 하나의 클래스에 대해서 일부 클래스만 접근이 가능하도록 하고 싶을 때 friend를 사용friend는 함수와 클래스에 사용 가능, 접근 제어 지시자를 무력화수직상속집합Composition - 여럿이 하나(생명주기가 같음, 멤버로 사용)Aggregation - 단순한 모임(생명주기가 다름, 참조 또는 포인터로 사용)
2024.06.04
no image
[C++] 상속
상속코드를 재사용하는 방법규모 확장관계의 한가지 유형기본 문법//class 파생클래스이름 : 접근제어지시자 부모클래스이름class CMyData{};class CMyDataEx : public CMyData{};※ 자식 클래스 선언 시 자식 클래스의 생성자보다 부모 클래스의 생성자가 먼저 실행됨참조 형식과 실 형식class CMyData{public: CMyData() { cout 일반 함수 - 참조 형식가상 함수 - 실 형식생성자부모 클래스의 생성자가 자식 클래스의 생성자보다 먼저 실행되나 호출은 자식 클래스가 먼저 호출됨※ 자식 클래스의 생성자에서 부모 클래스의 멤버 변수를 초기화 하게 되면 중복 발생자식 클래스에서 부모 클래스의 어떤 생성자를 호출할 지 선택 가능class C..
2024.06.02
no image
[C++] 연산자 다중 정의
c++에서는 class에 한해서 연산자 재정의 또는 다중 정의가 가능 고려해야 할 요소가 많아질 수 있음 class CMyData { public: void setData(int nParam) { MyData = nParam; } int getData() { return MyData; } private: int MyData; }; int main(int argc, char* argv[]) { CMyData a; CMyData b; a + b; // Error return 0; } class CMyData { public: void setData(int nParam) { m_nData = nParam; } int getData() { return m_nData; } /////////////////// //..
2024.04.15
no image
[C++] 생성자와 소멸자
생성자 종류기본 생성자 - 매개변수 존재 x다중 정의 생성자 - 매개변수 존재(변환 생성자 - 매개변수가 1개)복사 생성자(r-value 참조)이동 생성자복사 생성자Deep copy : 대상체도 복사Shallow copy : 복사하여 같은 대상체를 참조(기본 복사 생성자)class CTest{public: CTest() { m_nData = new int(5); } CTest(const CTest &rhs) { this->m_nData = rhs.m_nData; } ~CTest() { delete m_nData; } int m_nData = 0;};포인터 멤버 변수에 대해서는 shallow copy를 했을 ..
2024.02.05
no image
[C++] 네임스페이스
namespace각종 요소들(변수, 함수, 클래스 등)을 한 범주로 묶어주기 위한 문법변수 또는 함수 이름의 중복을 방지하고자 등장::(범위 지정 연산자)#include namespace TEST{ int g_nData = 100; void TestFunc(void) { std::cout usingstd 네임스페이스를 using 예약어로 선언하여 생략 가능#include using spacename std;int main(void) { cout namespace 중첩namespace Test { int g_nData = 100; namespace DEV { int g_nData = 200; }}int main() { std::cout nam..
2024.02.05
no image
[C++] 함수
디폴트 매개변수함수를 호출할 때 실인수를 생략 가능 -> 호출자 코드만 봐서는 함수 원형을 유추 불가능확장성을 위해 사용하고, 미래의 수정에 닫혀있도록 하기 위해 사용디폴트 값은 반드시 오른쪽 매개변수부터 기술해야 함기본값과 함께 사용하면 모호성이 존재모호성은 유지보수에 좋지 않음int Add(int a, int b = 10){ return a + b;}int Add(int nParam){ return nParam + 10;}int main(void){ Add(3); //error: call of overloaded 'Add(int)' is ambiguous return 1;}함수 다중 정의C++은 다형성의 개념이 존재(Overloading)사용자의 편의를 위해 제작자는 같은 코드를 반복해야 ..
2024.02.05