프로그래밍 언어

    C extern (변수 / 함수 외부 선언)

    const와 typedef는 기본적으로 내부 링크로 처리되고 여기서 extern을 붙이면 외부 링크가 적용된다. 어떤 이름을 extern으로 지정하면 컴파일러는 이를 정의가 아닌 선언문으로 처리한다. 변수를 extern으로 지정하면 컴파일러는 그 변수에 대해 메모리를 할당하지 않는다 따라서 그 변수를 정의하는 문장을 따로 작성해야 한다. /* AnotherFile.cpp */ extern int x; int x{ 3 }; extern으로 선언하는 동시에 초기화가 가능하다. /* AnotherFile.cpp */ extern int x = { 3 }; extern을 붙이지 않아도 x는 기본적으로 외부 링크로 처리되기 때문에 생략 해도 된다. extern이 반드시 필요한 경우는 다른 소스 파일에서 x에 접근..

    C++ auto 타입 추론

    auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정된다 (타입 추론(type inference)). 이 기능은 생성 시 변수를 초기화할 때만 작동한다. 아래는 int형 변수 a와 float형 변수 b의 합을 auto키워드를 통해 sum변수에 저장하고 출력한 것이다. #include using namespace std; int main() { int a = 5; float b = 3.5; auto sum = a + b; cout

    C++ mutable

    원래대로라면 const로 멤버 함수가 상수화되면 이 함수는 멤버 변수를 변경시키지 못한다. 그러나 멤버 변수가 mutable로 선언되어 있다면 상수화된 멤버 함수라도 멤버 변수 변경이 가능해진다. class AAA { mutable int val; public: void setValue(int _val) const { val = _val; } }; setValue는 상수화된 멤버 함수이므로 원래대로라면 멤버 변수 val을 변경할 수 없지만 val 이 mutable로 선언되었으므로 값 수정이 가능하다. 출처 : https://cpp11.tistory.com/35

    C++ static (정적 변수 / 함수)

    정적 변수는 선언 후 외부에서도 선언을 한 번 더 해줘야한다. Test.h #pragma once class Test { public: static int Val; }; cpp 파일에서 재선언 해주면 된다. 그리고 접근하기 위해선 클래스::변수 또는 함수로 해주면 된다. #include #include "Test.h" using namespace std; int Test::Val = 0; int main() { cout

    C++ inout형 포인터 *&

    *&는 단순하게 포인터의 주소를 뜻한다, 쉽게 말해 포인터의 주소다. 착각하지 말아야할게 *&로 보낸다고 해서 참조 대상의 주소를 보내는게 아니다. 아래 레퍼런스는 참조 대상이다. int main() { int* p2 = new int(1); // 아래 *&p2는 &(*p2)의 의미를 가지고 있다. cout

    C++ 클래스 배열 포인터 및 2차원 배열 포인터

    클래스 포인터 배열은 아래와 같다. #include #include #define SIZE 3 using namespace std; class A { int mVal = 0; public: // 생성자 A() { cout

    C++ 간단하게 사용할 수 있는 포인터 해제 매크로 함수

    #include using namespace std; #define SAFETY_CHECK(ptr) \ { \ if (ptr == nullptr) \ { \ cout

    C++ 포인터 객체 자살 (delete this)

    delete this는 소멸자에 해선 안되고 또한 매우 안좋은 코딩 스타일이다. 사용하고자 하면 몇가지 주의 사항이 있다. new로만 인스턴스화가 되있어야 한다 (new[] X), 다른 포인터를 가리킨다던가, 레퍼런스를 가리켜서는 안된다. 맨 마지막 구문이여야 한다. 멤버 변수 변경 또는 함수 호출해선 안된다. this 오브젝트를 해제 후 건드려선 안된다, 역참조, -> 참조, 비교 등. class A { public: void fun() { delete this; } }; int main() { /* 실행 가능 */ A *ptr = new A; ptr->fun(); ptr = NULL; /* 에러 : Undefined Behavior */ A a; a.fun(); getchar(); return 0; ..

    C++ 정적 바인딩과 동적 바인딩의 차이점

    바인딩은 일반적으로 한 항목을 다른 항목에 매핑하는 것을 나타낸다. 컴파일된 언어의 컨텍스트에서 바인딩은 함수 호출과 함수 정의 간의 연결이다. C++에서 함수가 호출되면 프로그램 컨트롤은 해당 함수가 정의된 메모리 주소에 바인딩된다. C++에는 정적(또는 초기) 바인딩과 동적(또는 후기) 바인딩의 두 가지 유형의 바인딩이 있다. 이 게시물은 C++의 정적 바인딩과 동적 바인딩의 차이점에 대한 개요를 제공한다. 정적 바인딩은 컴파일 타임에 발생하고 동적 바인딩은 런타임에 발생한다. 따라서 각각 조기 및 후기 바인딩이라고도 한다. 정적 바인딩에서는 함수 정의와 함수 호출이 컴파일 시간에 연결되지만 동적 바인딩에서는 런타임까지 함수 호출이 해결되지 않으므로 런타임까지 바인딩되지 않는다. 정적 바인딩은 함수를..

    C# 구조체가 IEquatable<T>를 상속해야 하는 이유

    C#의 모든 타입의 최상위 클래스인 Object에는 .Equals(object) 메소드가 존재한다. 그리고 이를 통해 다른 값과의 동일 비교를 수행할 수 있다. 구조체나 클래스를 직접 정의하고, 해당 객체로 .Equals(object)를 호출하면 object.Equals(object)가 호출된다. 박싱 int a = 1; object oa = a; Value Type을 object 타입으로 캐스팅하면 박싱이 일어난다. IL_0001: ldc.i4.1 IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: box [mscorlib]System.Int32 IL_0009: stloc.1 디스어셈블러를 통해 CIL 코드를 열어보면 위와 같이 확인할 수 있다. .Equals(object)에서..