Program Languege/C/C++ 썸네일형 리스트형 호출 규약 호출규약 호출규약은 호출원과 함수간의 약속이므로 양쪽이 다른 형태로 약속을 할 수도 있는 것이다. 호출 규약 인수 전달 스택 정리 이름 규칙 __cdecl 오른쪽 먼저 호출원 _함수명 __stdcall 오른쪽 먼저 함수 _함수명@인수크기 __fastcall ECX, EDX에 우선 전달. 나머지는 오른쪽 먼저 함수 @함수혐@인수크기 thiscall 오른쪽 먼저, this 포인터 ecx레지스터로 전달된다. 함수 C++ 이름 규칙을 따름. naked 오른쪽 먼저 함수 없음 __stdcall __stdcall은 윈도우즈 API 함수들의 기본 호출을 규약을 사용한다. __cdecl과 인수를 전달하는 방법은 동일하되 인수 전달에 사용된 스택을 정리하는 주체가 호출원이 아니라 함수라는 점이 다르다. 함수의 이름 앞에.. 더보기 얕은 복사, 깊은 복사 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) 얕은 복사와 깊은 복사는 복사 생성자, 대입 연산자와 관련이 있다. 객체 간에 대입이나 복사에서 일어나는 일이기때문이다. 먼저 얕은 복사에대해 설명하면 얕은 복사는 일반적인 값의 복사를 말한다. 클래스에서 기본적으로 제공하는 복사 생성자와 대입 연산자에서 발생하는 현상이다. 기본적으로 제공하는 복사생성자를 사용하는 클래스를 작성하였다. 문제 없이 출력이 되는 것을 확인할 수 있다. test2의 생성과 동시에 test1을 대입하여 복사생성자를 호출하였다.(선언과 동시에 대입하여 초기화하는 경우 복사생성자 호출. 이부분은 나중에 다시 글에 올리겠다.) 이 경우 런타임 오류가 발생한다. test1의 m_c와 test2의 m_c가 같은 객체를 .. 더보기 Console 출처 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073(v=vs.85).aspx AddConsoleAlias 지정된 실행 파일 콘솔 별칭을 정의한다. BOOL WINAPI AddConsoleAlias(LPCTSTR Source, LPCTSTR Target, LPCTSTR ExeName); Source - Target에 붙일 별칭. Target - Source의 별칭이 붙을 대상. NULL인 경우. 해당 콘솔 별명을 제거한다. ExeName - 콘솔 별칭을 정의할 실행파일 이름. 반환 값은 성공 시 TRUE, 실패 시 FALSE 이며, GetLastError를 통해 오류 정보를 알 수 있다. Alloc Console 호출 프로세스를 위한.. 더보기 const의 선언 위치 const 선언 위치 1) const int *p1; 여기서 const의 의미는 포인터 p1이 가리키는 변수의 값을 바꾸지 않겠다는 의미이다. p1이 가리키는 대상은 얼마든지 바꿀 수 있다. 다만 주소를 통한 참조로 값을 바꿀 수는 없다. 그렇기때문에 17번째 줄에서 오류가 발생한다. 2) int const *p2; 이 경우도 위에 1)과 같은 의미가 된다. 위에 코드를 보면 알겠지만 같은 동작에서 같은 오류가 발생하고있다. const int *p == int const *p 3) int * const p3; 여기서 const의 의미는 const int a = 0;처럼 해당 변수를 상수화 시키는 것으로 이 포인터 p3가 한번 가리킨 대상을 절대 바꾸지 않겠다는 뜻이다. 대신 가리킨 대상을 주소를 통해 참.. 더보기 템플릿 - 4 템플릿 - 4 함수의 호출 우선 순위 템플릿 함수와 일반 함수,특수화 템플릿 함수가 있을 때 호출 우선 순위를 알아보도록 하겠다. 위와 같은 예제에서 실행을 해보면 다음과 같은 결과가 나온다. 첫번째 int형에 대해서는 특수화, 일반, 템플릿 함수중에서 일반 사용자 정의 함수가 호출 되었다. 두번째 char*형에 대해서는 특수화 템플릿 함수가 호출되었다. 그뒤에 형변환이나 일반 정수에 의한 호출에서도 사용자 정의 함수가 호출 되었다. 마지막 실수형에 대해서는 템플릿 함수가 호출되었다. 이 결과를 가지고 유추해보면 가장 먼저 일반 사용자 정의 함수가 호출 되는 것을 알 수 있다. 그럼 일반 사용자 정의 함수를 주석 처리를 하고 실행해보도록하겠다. 일반 사용자 정의 함수를 제외하면 특수화 템플릿 함수가 일반.. 더보기 템플릿 - 3 템플릿 - 3 템플릿의 특수화 특수화라는 의미보다는 예외의 경우에 대한 처리라는 의미로 이해하면 좀 더 이해하기 쉬울 것이라 생각된다. 예시를 하나 들고 설명을 하도록 하겠다. Ex> template T Max(T a, T b) { return a > b ? a : b; } int main(void) { cout 더보기 템플릿 - 2 템플릿(Template) - 2 이번엔 클래스 템플릿, 템플릿 클래스에 대해 알아보자. 이전에 함수 템플릿, 템플릿 함수를 생각해본다면 바로 무엇인지 감이 올 것이라 생각된다. Ex> class Point { private: int xpos, ypos; public: Point(int x = 0, int y = 0) : xpos(x), ypos(y) { } void ShowPosition() const { cout 더보기 템플릿 - 1 템플릿(Template) - 1 템플릿은 사전적인 의미로 형틀, 무언가를 찍어내는 틀을 말한다. 프로그래밍에서도 같은 의미로 무언가를 만들어내는 틀을 말한다. 함수 템플릿을 통해 좀 더 자세한 설명을 할텐데 함수 템플릿은 함수를 만들어내는 템플릿을 말한다. Ex> template T Add(T num1, T num2) { return num1 + num2; } 위의 예시에서 살펴보면 template 라는 것이 보이는데 이 문장은 T라는 이름을 이용해서 아래의 함수를 템플릿으로 정의한다는 의미이다. 그리고 T는 자료형을 결정짓지 않겠다는 의미이다. - T대신에 다른 이름을 사용해도 된다. 사용자 정의 함수에서 매개변수의 이름과 같다고 생각하면 된다. Ex> - template 에서 template로 선언해.. 더보기 순수 가상함수 순수 가상함수 virual void Func() = 0; 과 같이 정의된 함수를 말하며 여기서 = 0은 0을 대입하는 의미가 아닌 컴파일러에게 몸체를 정의하지 않았다고 알리는 의미이며 순수 가상함수를 가진 클래스의 객체를 가질 수 없다.(해당 클래스의 인스터스화 불가) Ex> virtual 반환형 함수이름() = 0; 순수 가상함수를 한 개 이상 가진 클래스를 추상 클래스라한다. 추상 클래스는 역시 위에서 말한대로 인스턴스화 될 수 없다. 추상 클래스를 상속받아 자식 클래스에서 순수 가상 함수를 재정의를 해야한다. 그렇지 않으면 자식 클래스 역시 추상 클래스가 되며 인스턴스화를 할 수 없다. 추상 클래스는 상속만을 위한 클래스로, 인터페이스를 정의하는 클래스로 사용된다. 순수 가상함수와 가상 함수의 다른.. 더보기 가상함수 가상함수 virtual 키워드가 붙은 함수로 가상함수 테이블을 생성하며 현재 참조하고 있는 객체에 맞는 함수 호출을 할 수 있게된다. 헤더 파일 cpp 파일 메인 위의 예제에서 실행 결과를 예측해보고 다음 결과를 보길 바란다. 실제로 가리키고 있는 객체는 Three클래스의 객체이지만 포인터의 클래스에 따라 다른 함수들이 호출되었다. 바로 이 문제가 위에서 언급한 문제이다. 다음은 한가지 더 문제를 더 보여주도록 하겠다. 헤더 파일 cpp 파일 메인 실행을 하면 어떤 문제가 발생할까? 분명 자식 객체를 동적으로 할당했는데 소멸자는 부모의 소멸자만 생성되었다. 위에서 제시한 문제와 지금 제시한 문제의 공통점을 본다면 부모 클래스의 포인터와 그안에 들어있는 객체는 자식 클래스의 객체라는 점이다. 자식 클래스를.. 더보기 이전 1 2 3 4 다음