본문 바로가기
728x90

Programing_Language/C++11

스마트 포인터 스마트 포인터 new와 delete 키워드를 사용 하지 않고 사용이 끝난 포인터를 메모리에서 자동으로 해제 해주는 클래스 템플릿 메모리 누수로부터 안전성을 보장하기 위함 스마트 포인터 종류 unique_ptr shared_ptr weak_ptr (TODO) 정리 예정 c++11 이후로 auto_ptr은 사라짐. 스마트 포인터는 헤더에 정의 되어있음 unique_ptr 특정 객체를 하나의 포인터만 소유 할 수 있도록 소유권 개념의 포인터 다른 포인터와 객체 핸들링을 공유할 수 없기 때문 lvalue 시멘틱이 적용 되지 않는다. ex) ptr1 = ptr2 (ptr1 과 ptr2 는 unique_ptr) 다른 포인터로 객체 참조를 이동시키기 위해 move(이동)시멘틱을 사용한다. ptr1 = std::mov.. 2020. 12. 21.
c++ 함수 포인터 C와 C++의 함수포인터 C에서의 함수포인터 타입 재정의 함수 역시 주소를 가지고 있기 때문 포인터와 마찬가지로 함수를 가리키는 포인터를 만들 수 있다. //짝수인지 반환 함수 bool isEven(const int& number) { return (number % 2) ? false : true; } //함수포인터 타입 재정의 typedef bool(*check_func)(const int&); //배열의 짝수들 출력 void printEvenNumber(const array& my_arr, check_func = isEven) { for (const auto &e : my_arr) { if (isEven(e)) cout 2020. 12. 16.
assert (단언하기) in C++ assert assert 는 Debug 모드에 실행된다. 디버깅시 컴파일러의 도움을 받을 수 있다. static_assert는 컴파일 타임에 적용된다. assert 는 런타임에 적용된다. 반대로 assert 키워드는 Release 모드에서는 실행이 안된다. assert 변수 체크할때 사용 할 수 있다. 런타임에 적용 #include using namespace std; int main(void) { int a = 1; a+=9; /*... 많은 과정을 생략중...*/ assert(a==10) //이 과정이 끝나면 a는 반드시 10 이어야 한다고 가정 // 만약 19번 행에서 a가 10이 아닌 다른 수면 // debug모드에서 에러가 나면서 콘솔로 출력이됨. // return 0; } static_asse.. 2020. 12. 15.
템플릿(Template) (2/2) (템플릿 특수화) 템플릿 매개변수 일반적으로 클래스 템플릿을 작성할 때는 template 처럼 꺽쇠괄호 안에 매개변수를 나열한다. 이 매개 변수 T뿐만 아니라, 함수의 매개변수처럼 원하는 수 만큼 지정할 수 있다. 이때, 매개변수를 타입 대신 디폴트 값으로 정해도 된다. template //템플릿의 타입을 2개로 m_array의 size를 받는다. class ClassArr { private: T m_array[size]; public: T* getArray() { return m_array; } T& operator[](int index) { return m_array[index]; } void print() { for (int count = 0; count < size; ++count) cout 상속 특정한 타입에 대.. 2020. 12. 14.
템플릿(Template) (1/2) 템플릿(template) C++에서 언어 차원에서 객체지향 프로그래밍 뿐만 아니라 제네릭 프로그래밍(generic programming)도 지원한다. 제네릭 프로그래밍은 데이터를 중요시하는 객체지향적 프로그래밍 철학보단 알고리즘에 그 중점을 두었다. 템플릿(template)은 데이터 타입(data type)이 아닌 매개변수의 타입에 따라 클래스를 생성하는 클래스 템플릿 과 메서드 템플릿, C++14 이후 부터는 변수 템플릿 이 있다. 또한 템플릿은 템플릿 특수화라 하여 범위에 따라 다르게 템플릿을 적용시키는 템플릿 특수화 라는 개념이 있다. 함수 템플릿 특수화 클래스 템프릿 특수화 포인터에 대한 특수화 템플릿에 의한 형변환은 컴파일 타임에 결정된다. 즉 사람이 타입을 맞춰줄 필요없이 컴파일러에게 타입 결.. 2020. 12. 13.
2차원 동적 배열 할당과 해제 (배열 vs 벡터) 벡터를 애용하자 2차원 vector 선언 vector v2; //2차원벡터 선언 vector v1 //1차원 벡터 선언 v1.push_back(2); v1.push_back(20); v1.push_back(337); //v2[0][0] == 2, v2[0][1] == 20, v2[0][2] == 337 v2.push_back(v1); 2차원 vector 초기화 //5x10 0으로 초기화시키기 (10열의 각 원소가 0인 배열을 5줄(행) 만든다.) vector v(5, vector(10,0)); //5x5 순환 접근 2차원 배열과 똑같다. for(int i=0; i 2020. 12. 7.
enum과 enum class (열거 타입과 엄격한 열거 타입) enum (열거형) enum 타입 내부 멤버들에게 정수(int)값으로 이름을 붙일 때 사용한다. 주로 내부 멤버이름을 대문자로 이름 짓는경우가 많다. 각 열거자들의 값은 이전 열거자 값에 +1이 증가 된 값으로 알아서 할당된다. ex) enum days {Sunday = 1 , Monday, Friday=10, Wednesday}; Monday == 2 (True) , Wednesday == 11 (True) 만약 enum 타입의 첫 번째 멤버에 값을 생략하면 컴파일러가 알아서 0부터 대입 해준다. 실제 메모리를 잡아먹지 않는다. 단 열거자가 할당된 변수에 대해 메모리가 할당됨. 그럼 열거형을 쓰면 좋은점은? 왜 써요? 위험한 상황(의도하지 않게 타입의 값이 변경되어 다르게 동작 하는 상황들)을 피할 수.. 2020. 12. 6.
VisualStudio 내부 스택 크기 조절방법 프로젝트 속성 - 구성 속성 - 링커 - 시스템 스택 예약 크기 및 조절. 2019. 4. 6.
[MFC] 문자열 변환 매크로 및 사용 주의사항 CString 을 char*나 char*를 CString으로 변환시 W2A A2W 혹은 _T(" ") 매크로를 사용하여 변환하는경우 스택오버플로우가 발생하는 문제점을 직면했다. 반복문내에서 여러번 변환과정할때 내부 스택을 사용하기 때문에, 반복적으로 사용하면 스택오버플로우가 발생함. ATL7.0부터 도입된 CW2A와 CA2W는 위의 문제를 피할 수 있다. 단, 내부 버퍼의 일정 크기를 넘어서면 힙에 메모리를 할당하게 된다. 따라서, 스택 오버플로우로 인한 프로그램이 죽는현상을 방지할 수 있다. ex) char* -> CString 으로 변환 ex) CString -> char*로 변환 ex 0611_추가) UTF_8 문자열 집합 인코딩 변환 하는법 참조 : https://docs.microsoft.com.. 2019. 4. 6.
[MFC] CFileDialog 클래스 1 2 3 4 5 6 7 8 9 explicit CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL, DWORD dwSize = 0, BOOL bVistaStyle = TRUE); 1. 매개 변수 - bOpenFileDialog : TRUE(파일 열기 대화상자) , FALSE : 다른 이름으로 저장 대화상자. - lpszDefExt : 기본 파일 이름 확장명 - lpszFileName : 파일 이름 상자에 .. 2019. 4. 6.
728x90