전체 글 122

C++ 대입 연산자는 왜 void로 선언하면 안될까? 반환 타입에 왜 참조자를 붙여야 할까?

class AAA { public: int x; int y; public: AAA(int _x, int _y) : x(_x), y(_y) {}; } 위와 같은 클래스가 있을 때 대입 연산자를 어떻게 작성할까? 대부분 아래와 같이 작성 할것이다. AAA& operator=(const& AAA aaa) { x = aaa.x; y = aaa.y; return *this; } 여기서 의문점이 드는것은 두가지였다. 첫번째는 그냥 대입만 하면 되니까 void 리턴 타입으로 하면 되지 않을까? 였다. 첫번째 의문은 나와같은 의문을 가진 사람의 stackoverflow 질문에 대한 답변에서 찾을 수 있었다. 결론부터 이야기하면 void 리턴타입으로 대입 연산자를 만드는게 가능은 하지만, 그렇게 하면 A = B = C같..

공부/C || C++ 2021.07.18

Visual Studio "const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다.

char* pText = "String"; 다음과 같은 코드를 써서 컴파일하니 이런 오류가 떴다. '초기화 중' : 'const char[7]에서 'char*'(으)로 변환할 수 없습니다. 이 에러가 뜨는 원인은 Visual Studio 2017부터 준수모드로 설정하면 const char* 에서 char*로의 암시적 형변환을 허용하지 않기 때문이다(준수모드는 2번째 방법에서 바꾸는 방법을 소개). 해결 방법은 2가지가 있다. 1번째는 char*를 const char*로 바꾸면 된다. const char* pText = "String"; 2번째 방법은 Visual studio 설정을 바꿀 수 있는 상황에서 사용할 수 있다. 프로젝트 우클릭 > 속성 > C/C++ > 언어 > 준수 모드를 아니요로 바꾸면 c..

공부/그 외 2021.07.16

C++11 chrono

프로그램을 작성하다 보면 두가지 기능의 성능을 비교할 때 초단위로 혹은 그보다 정밀한 단위로 시간을 측정해야할 경우가 있다. C++ 11에서는 chrono 라이브러리에서 nanosecond단위의 시간 측정을 지원한다. 예를 들어서 피보나치 수열 함수를 동작하는데 걸리는 시간을 second, millisecond 그리고 nanosecond 단위로 측정해보자. #include #include long fibonacci(unsigned n) { if (n < 2) return n; return fibonacci(n - 1) + fibonacci(n - 2); } int main() { auto start = std::chrono::high_resolution_clock::now(); fibonacci(40);..

공부/C || C++ 2021.07.16

Visual Studio 2019에서 git 사용 방법

학부생때는 git에 코드 제출할때 매번 리눅스 쉘을 이용한 커맨드로 제출해서 그런지 visual studio에서 git을 사용하는 방법은 전혀 몰랐다. 사실 리눅스 쉘을 쓸 때도 대단한걸 할 수 있었던 것은 아니고 그냥 repository를 clone하고 코딩하고 다시 commit&push를 하거나 과제 템플릿에 변경이 있을 때 pull한게 전부였다. 근데 그마저도 visual studio로 하려니 전혀 할줄 몰라서 이번 기회에 공부해보려고 한다. 먼저 visual studio 2019에서 git을 사용하기 위해선 Github extension을 설치해야 한다. 설치 방법은 우선 상단의 검색창에서 확장 관리를 검색해서 누른 뒤 GitHub Extension for Visual Studio를 설치한다. 다..

공부/Git 2021.07.16

C++ 11 default, delete 키워드

C++ 11에서는 자체적으로 선언하지 않을 경우 기본 생성자, 복사 생성자, 복사 할당 연산자 및 소멸자를 자동으로 생성하고 이러한 함수는 특수 멤버 함수 라고 한다. 이런 특수 멤버 함수에는 몇가지 규칙이 있다(아래 규칙들은 microsoft docs에 있는걸 가져왔다). 생성자가 명시적으로 선언된 경우 기본 생성자가 자동으로 생성되지 않습니다. 가상 소멸자가 명시적으로 선언된 경우 기본 소멸자가 자동으로 생성되지 않습니다. 이동 생성자 혹은 이동 할당 연산자가 명시적으로 선언된 경우 다음과 같습니다. 복사 생성자가 자동으로 생성되지 않습니다. 복사 할당 연산자가 자동으로 생성되지 않습니다. 복사 생성자, 복사 할당 연산자, 이동 생성자, 이동 할당 연산자 또는 소멸자가 명시적으로 선언된 경우 다음과 ..

공부/C || C++ 2021.07.15

git Commit Message Convention

얼마전 visual studio에서 깃 사용에 관한 구글링을 하다가 우연치않게 깃 commit message convention에 관한 글을 보게 되었다. 결론부터 이야기하면 git commit message는 팀원들끼리 중요한 약속이기 때문에 반드시 규칙에 맞게 작성해야 한다고 한다. 어떤 회사 채용 담당자분은 "깃 커밋 메세지만 봐도 이 사람을 채용해야 될지 아닐지 판단할 수 있다" 라고 하니 내가 생각했던 것 보다 훨씬 중요한 것 같다. 사실 나는 학부생때까지만 해도 commit message라고 해봤자 "initial commit"이나 그날 날짜와 대강 고친 내용만 쓰는게 전부였다... 그렇다면 이제 git commit message에도 규칙이 있다는 것을 알았으니 그 규칙이 어떤 규칙인지 알아보..

공부/Git 2021.07.15

메모리 풀(Memory Pool)

학부생때 들어보기만한 메모리풀을 직접 구현해봤다. 듣기만 해서 대충 개념만 알고 있어서 직접 구현하려니 어디서부터 시작해야할지 몰랐다. 그래서 구체적으로 메모리 풀이 어떤건지 개념을 다시 정리하는 것 부터 시작했다. 위키피디아에선 메모리 풀은 고정된 크기의 블록을 할당하여 malloc이나 C++의 new 연산자와 유사한 메모리 동적 할당을 가능하게 해준다. memory pool은 불리는 동일한 사이즈의 메모리 블록들을 미리 할당해 놓는다. 그러면 응용 프로그램들은 실행 시간에 핸들에 의해서 표현되는 블록들을 할당하고, 접근하고, 해제할 수 있다. 이 말을 조금 나의 방식대로 풀어서 설명하면, 거대한 덩어리의 메모리 블록을 미리 할당해놓고, 이것을 사용자가 원하는 만큼 조금씩 떼어서 준다는 것이다. 왜 사..

공부/그 외 2021.07.14

C++ time 함수와 rand, srand 함수

C++에서는 헤더에 포함된 time 함수를 제공한다. time 함수의 원형은 다음과 같다 time_t time(time_t *pTime) 여기서 time_t는 시간을 나타내기 위해 만들어진 데이터 타입인데 __int64와 같다. typedef __time64_t time_t; typedef __int64 __time64_t; time 함수는 1970년 1월 1일을 기준으로 1초씩 증가해서 함수 호출 당시에는 몇초가 지났는지를 반환해준다. 사용법은 아래와 같이 두가지가 있다. time_t t1 = time(nullptr); //방법 1, nullptr 대신 0을 줘도 무관 time_t t2; time(&t2); // 방법 2 time 함수의 기능이 1970년 1월 1일을 기준으로 1초씩 증가한다고 했다. ..

카테고리 없음 2021.07.14

C++ 11 enum class

C++ 11부터는 enum class라는 syntax를 지원한다. 이 enum class는 기존의 enum의 문제점을 보완하고자 나온 syntax이다. enum은 사용자 정의 타입임에도 정수형과 호환이 가능하다. 예를 들어서 enum Color { RED, GREEN, BLUE }; int main() { int rgb = RED; } 또한 enum은 정의하면 enum내에서가 아닌 enum이 포함된 스코프 내에서 정의되기 때문에 같은 스코프 내에서 서로 다른 enum 블록에서 정의한다고 하더라도 이름이 겹치면 재정의된 것으로 보고 오류가 난다. 예를 들어서 int main() { enum Color { RED, BLUE, GREEN, // duplicated! }; enum Color2 { GREEN, ..

공부/C || C++ 2021.07.10