본문 바로가기

STUDY/C++

(13)
전위(prefix) vs 후위(postfix) 증감연산자 우리는 증감연산자를 오버로딩할 때 다음과 같이 정의합니다. class Point { public: Point& operator++();//전위++ const Point operator++(int);//후위++ private: int _value; }; 전위는 인자가 없고, 후위는 증감연산자가 호출될 때 0을 넘기도록 하는 것입니다. 이보다 더 중요한 것은 전위형태는 참조자 타입을 반환하고, 후위 형태는 const 객체타입을 반환합니다. 보통 사람들은 전위형태는 "증가시키고 값을 사용하는" 연산자이고, 후위 형태는 "값을 사용하고 증가시키는" 연산자로 외우고 있을 것입니다. c++ 스펙에서 공식적으로 이렇게 설정되어 있습니다. class Point { public: Point() :_value(0) {};..
사용자 정의 타입변환과 explicit C++ 은 컴파일러가 암시적인 타입변환을 할 수 있도록 합니다. char를 int로 short를 double로 double을 short로 변환이 가능하며 별 문제가 생기는 경우도 없습니다 standard한 타입에 대해서는 자유로운 형변환을 막을 방법이 없지만, 우리가 직접 만드는 타입에 대해서는 형변환 결정권은 우리가 가질 수 있습니다. 컴파일러가 사용하는 타입변환 함수는 두가지입니다. 1. 단일인자 생성자 2. 암시적 타입변환 연산자 1. 단일인자 생성자 암시적 타입변환 연산자는 operator만 붙어있는 꼴입니다. 이 함수는 반환값 타입이 없습니다. 아래 Rational class에 있는 operator double이 암시적 타입변환 연산자입니다. class Rational { public: Rati..
스마트포인터 shared_ptr 구현하기 (2) - thread safety thread safety ? c++ refenence 를 보면 다음과 같이 나와 있습니다. 더보기 All member functions (including copy constructor and copy assignment) can be called by multiple threads on different instances of shared_ptr without additional synchronization even if these instances are copies and share ownership of the same object. 해석 모든 멤버 함수(복사 생성자, 복사 할당 연산자를 포함한)는 해당 인스턴스들이 복사되거나 똑같은 객체 소유권을 공유한다해도 다른 공유 포인터의 인스턴스에서 추가..
스마트포인터 shared_ptr 구현하기 (1) 오늘부터 여러번에 걸쳐 스마트 포인터 중에서도 shared_ptr에 대해서 자세하게 다뤄볼 예정입니다. shared_ptr을 직접 구현할 작업이 있어 해보다 재미있는 내용이 많아 포스팅 해 보려고 합니다. [ shared_ptr ? ] shared_ptr에 관한 설명을 cpp reference에서 가져온 내용입니다. 이런식으로 설명이 되어 있습니다. std::shared_ptr은 포인터를 통하여 object의 공유된 소유권을 유지합니다. 여러 shared_ptr object는 같은 object를 가지고 있습니다. 그리고 그 오브젝트는 다음이 일어날 때 파괴가 됩니다. - 오브젝트의 소유권을 가진 마지막 shared_ptr 이 삭제될 때. - 오브젝트의 소유권을 가진 마지막 shared_ptr이 다른 포인..
편리하지만 주의해야 하는 연산자 오버로딩 operator 이번엔 연산자 오버로딩에 대해 포스팅을 해보려고 합니다. 연산자 오버로딩은 기존에 있던 연산자를 정의하는 것입니다. #include using namespace std; class OperatorTest { private: int _num; public: OperatorTest(int num1) : _num(num1) { } void printMember() { cout
std::map에 관한 고찰 오늘은 map에 관하여 포스팅을 해 보려고 합니다. std::map은 key와 value가 pair 형태로 저장되며, 주로 key를 사용하여 value를 빠르게 탐색하기 위해 자주 쓰이는 컨테이너입니다. map은 노드기반 균형이진트리 구조로 삽입시 자동으로 정렬이 됩니다. map 사용방법은 아래처럼 간단합니다. #include #include #include using namespace std; int main(void) { map _testMap; _testMap.insert(make_pair(1, "data1")); _testMap.insert(make_pair(2, "data2")); _testMap.insert(make_pair(3, "data3")); _testMap.insert(make_pai..
선언과 정의에 따른 메모리 1.Class의 정의와 메모리 클래스가 정의된 경우 : 프로세스가 아닌 컴파일러가 사용하는 메모리에 저장된다. class의 경우, 함수부는 Instance가 생성될 때마다 가지고 있게 된다면 굉장히 비효율적이다. 따라서 한 class의 Instance들은 코드영역에 올라간 함수를 공유한다. 대신, 코드영역에 올라갈 때 각각의 멤버변수에 접근할 수 있도록 해당 클래스의 포인터를 받도록 변경되어 올라가게 된다. ex ) 선언 : void classA::Func1 ( void ); 코드영역에 올라갈 때 : void classA::Func1 ( classA* ca ); 2. 논리 공간 수많은 cpp 파일은 컴파일러에 의해 cpp파일에 대응되는 obj파일을 만들게 된다. 실행파일 및 동적 라이브러리가 존재하는 가..
new 와 new []의 차이점 동적 할당인 new를 사용하면 delete를 사용하여 메모리 해제를 해 주어야하고, new[]를 사용하면 delete[]를 사용하여 메모리를 해 주어야 한다는 사실은 C++개발자라면 누구나 알고 있습니다. 하지만 new와 new[]가 내부적으로는 완전히 다른 방식으로 동작하게 됩니다. 1. new의 내부 동작 new를 사용하여 메모리 할당을 하게되면 내부적으로는 malloc을, delete를 사용하여 메모리를 해제하게 되면 내부적으로는 free를 호출하게 됩니다. int*p = new int; -> malloc(sizeof(int)) malloc은 Heap Manager에게 메모리 할당을 요청하고, Heap Manager는 관리하고 있는 힙에서 적절하게 4바이트만큼의 메모리 블록을 찾은 후, 해당 블록의..