본문 바로가기

Programming

[C++11] NULL을 대체하는 nullptr C++이 2011년에 최신 개정판이 추가되었습니다.기존에 C++0x로 불리다가 정식으로 채택되면서 C++11로 이름이 변경 되었습니다.C++11은 개정된 년도를 따는 기존의 방식에 따라서 이름이 붙여졌습니다.이전에 개정된 TR1(Technical Report 1)이 STL의 기능적인 추가에 치중했다면이번 C++11은 C++의 기본 문법적인 부분에 변경이 있습니다.문법적인 변경 사항에 대해서 하나하나 살펴보고자 합니다.첫 번째 변경 사항은 nullptr 입니다.nullptr은 NULL을 대체하게끔 만들어졌습니다.기존 NULL의 문제점C++ 03 4.10 절에서 0은 integer 상수와 널 포인터 상수 두 개의 기능을 갖는다고 되었습니다.이 정의는 K&R C의 정의에 기반하고 있습니다.여기서 문제가 발생되.. 더보기
Calling Convention(함수 호출 규약) 함수를 호출하는데는 몇 가지 지켜야 할 약속이 있습니다.변수를 어떻게 넘겨줄 것인가, 리턴값의 반환,인수로 전달한 것을 어떻게 정리할 것인가 등이 약속되어 있어야 합니다.호출하는 함수(caller)와 호출 당하는 함수(callee) 사이에는이 약속이 지켜져야 하는 것은 당연합니다.만약 이 약속이 안 맞춰지면 거의 100% 프로그램이 죽는다고 보면 됩니다.프로그램이 실행이 되면 프로세스라 칭해지며, 메모리가 할당이 됩니다.이렇게 메모리가 할당되면 힙 영역과 스택 영역이 존재하게 되는데,힙은 낮은 번지에서 높은 번지로 자라나고,스택은 높은 번지에서 낮은 번지로 자라난다고 합니다.힙과 스택의 사이에는 자유 영역이 존재하고이 자유영역이 겹치게 되면 메모리 부족이 발생합니다.함수를 호출하면 전달되는 인자나 내부의.. 더보기
C++ 클래스 생성자에서 초기화 리스트 사용해야하는 경우 C++에서는 클래스를 생성하는데 호출되는 생성자라는 특수한 형태의 함수가 있습니다. class A{}; 가 정의되어 있을때 생성자의 이름은 A(){}이고, 리턴 타입은 존재하지 않습니다. 생성자는 오버로딩이 가능합니다. 즉, 넘겨줄 인자의 형식을 달리해서 다양한 생성자를 둘 수 있습니다. 또한 생성자는 보통 다음과 같이 표현됩니다. A(int a, int b) { m_a = a; m_b = b }; 그런데 이런 방식 말고 초기화 리스트(Member Initialization List)를 사용해서 클래스를 초기화할 수 있습니다. 초기화 리스트는 다음과 같이 표현됩니다. A(int a, int b) : m_a(a), m_b(b) { //더 할 일 }; 되도록이면 초기화 리스트를 사용해서 초기화하는 것을 권장.. 더보기
간단한 GCD 알고리즘(Euclid 호제법) 간단한 GCD(최대공약수)를 구하는 코드입니다. 여기에 이용되는 방법 중 하나가, 유클리드 호제법이라는 방법입니다. A, B가 있을 때((A > B)라고 가정) A를 B로 나눴을 때 나눠지면 B가 최대 공약수입니다. 하지만 나누어 떨어지지 않으면 A를 B로 B를 A % B로 치환하고서 다시 A % B를 실행합니다. 계속 반복했을 때 A % B = 0이 됐을 때의 B값이 GCD값이 됩니다. 12와 9를 기준으로 보겠습니다. A % B = 3 입니다. 나누어 떨어지지 않았기 때문에 A = B, 즉 9가 되고 B = A%B, 즉 3이 됩니다. 9와 3을 가지고 다시 돌립니다. A%B = 0 그럼 여기서 나오는 3(B의값)이 최대공약수라는 것을 알 수 있습니다. 최대공약수가 쓰이는 부분은 많지만 가장 기본적인 .. 더보기