2019의 게시물 표시

컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자

항목 6 : 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 .  클래스의 복사 대입 연산자 , 복사 생성자를 그야말로 완벽하게 막기 위해서는 private 으로 선언해주고 정의를 빼면 된다 . (friend class 에서도 쓸 수 없게 된다 . 만약에 사용하려 한다면 컴파일 단계에서 링크에러 발생 ).  좀더 일찍 컴파일 단계에서 에러를 검출하고 싶다면 ,  기반클래스에서 복사 생성자 & 복사 대입 연산자를 private 선언 해준 뒤 파생클래스에서 private 상속까지 하면 절대 사용하지 못한다 . 1 2 3 4 5 6 7 8 class  HomeForSale { public : private :     HomeForSale( const  HomeForSale & );     //선언만 달랑 있습니다.     HomeForSale &   operator = ( const  HomeForSale & );     //요 방식으로, 복사 생성자 와 대입 연산자를 사용할 수 없도록 막아버린다. }; Colored by Color Scripter cs 표준   라이브러리   구현환경에서  ios_base, basic_ios, sentry 가   이   방식으로   선언되었다 1 2 3 4 5 6 7 8 9 10...

객체를 사용하기 전에 반드시 그 객체를 초기화하자

항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include <iostream> #include <vector> #include <string> class Item3 { public: //기본타입 객체는 경우에 따라 저절로 초기화가 되기도 하고 그렇지 않기도 한다. int x = 0 ; //직접 초기화 const char * text = "A C-style string" ; //포인터의 직접 초기화 void DoSomething () { double d; std::cin >> d; //입력 스트림에서 읽으면서 초기화 } Item3( int val, bool ) { x = val; //이 구문은 초기화가 아니라 대입. //정확히는 초기화가 이루어진 변수에 값을 대입시키는 것 } Item3( int val) : x(val) {} //제대로 된 초기화 Item3() : //생성자 호출 theName(), //string 생성자 호출 theAddress(), //마찬가지 Numbers(), //마찬가지 numTimesConsulted( 0 ) //0으로 초기화 {} private: std::string theName; std::string theAddress; std::vector< int > Numbers; int numTimesConsulted; }; C++ 에서의 객체 초기화에는 규칙이 몇 가지 있다 . 어떤 컴파일러를 막론하고 , 기본 클래...

sbrk(), brk() 메모리 할당(malloc) 시 호출되는 시스템 콜

참조 : https://en.wikipedia.org/wiki/Sbrk http://man7.org/linux/man-pages/man2/brk.2.html https://pubs.opengroup.org/onlinepubs/7908799/xsh/brk.html  메모리 관리에 사용되는 기본적인 시스템 콜 명령어 int brk(void * addr ); The  brk()  function sets the break value to  addr  and changes the allocated space accordingly. brk() 는 addr 주소 위치에  program break  (현재 프로세스의 data segment의 끝부분 바로 다음 자리)를 설정한다.  program break )를 설정한다.  program break 의 위치를 옮김으로써 메모리를 할당하거나 반환한다.  성공시 brk() 는 0을 반환하고 실패시 -1 을 반환한다. void *sbrk(intptr_t increment ); The  sbrk()  function adds  incr  bytes to the break value and changes the allocated space accordingly. If  incr  is negative, the amount of allocated space is decreased by  incr  bytes. The current value of the program break is returned by  sbrk (0).  sbrk() 는  program break 에 increment 만큼 더한 뒤 그만큼 할당된 메모리를 변경한다. 만약에 increment가 음수이면 할당된 메모리는 ...

낌새만 보이면 const를 들이대 보자

아이템 3 : 낌새만 보이면 const 를 들이대 보자 Const 는 상수 값을 선언하는 데 사용된다 . 여러 가지 용도로 사용되는데 , 상수 포인터 STL 의 const_iterator 함수 선언 - 함수 반환 값을 상수로 정해 주면 , 안전성이나 효율을 포기하지 않고도 사용자측의 에러 돌발 상황을 줄이는 효과를 꽤 자주 볼 수 있게 된다 .  1 2 3 4 5 6 7 8 9 10 class Rational {}; const Rational operator * ( const Rational& lhs, const Rational& rhs); //반환 값을 const 로 선언한 이유는 void DoSomething () { Rational a, b, c; (a * b) = c; //여기서 a*b의 결과에 두고 operator = 을 호출하는 것을 막기 위해 //const 라서 값 변경 불가능 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class TextBlock { public: TextBlock(std::string str) : text(str) {} const char & operator [](std:: size_t position) const { return text[position]; } //상수 객체에 대한 operator[] char & operator [](std:: size_t position) { return text[position]; } //비상수 객체에 대한 operator[] private: std::string text; }; void DoSomething2 ()...

공부 자료

공부자료 URL 모음 https://www.geeksforgeeks.org/commonly-asked-algorithm-interview-questions-set-1/ gfg - c++ 인터뷰 질문 모음 확인할 것. 객체 지향 절차지향 차이점 :  https://m.blog.naver.com/atalanta16/220249264429 c++ gof 디자인 패턴 예시 : https://github.com/JakubVojvoda/design-patterns-cpp 클래스 다이어그램 :  https://github.com/brodieroy/Study/wiki/(U)-UML-%ED%81%B4%EB%9E%98%EC%8A%A4%EA%B0%84-%EA%B4%80%EA%B3%84(association,-composition,-aggregation,-dependency) 유니티 알아두면 좋은 점 :  http://blog.naver.com/PostView.nhn?blogId=hana100494&logNo=221352372493&parentCategoryNo=&categoryNo=9&viewDate=&isShowPopularPosts=true&from=search 유니티 커스텀 타임라인 시그널  https://gametorrahod.com/how-to-make-a-custom-signal-receiver-with-emitter-parameter/ foreach랑 getenumertor 를 활용한 순환 방식이 어떻게 다른지 그리고 foreach에서 가비지가 발생하는 이유 https://m.blog.naver.com/PostView.nhn?blogId=dlwhdgur20&logNo=221015850179&proxyReferer=https%3A%2F%2Fwww.google.com%2F c# 메모리 누수 피하기  https://michae...

초기화 코드가 중복되는 것을 최소화하라

아이템 14 : 초기화 코드가 중복되는 것을 최소화하라 생성자 코드가 중복될 때, C++ 에서는 private 헬퍼 메소드를 작성하여 공용으로 사용하지만, C#에서는 공용 생성자를 이용하는 방법이 있다. C# 컴파일러는 공용 생성자를 이용하는 초기화 방식을 매우 특별한 문법으로 인식한다. 변수에 대한 중복 초기화 코드를 제거해줄 뿐 아니라 베이스 클래스의 생성자가 반복적으로 호출되는 것도 막아준다. 즉 객체 초기화를 위해 수행해야 하는 코드를 최적화해준다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class MyClass { private List< int > m_Data; private string name; //공용생성자 public MyClass () : this ( 0 , "" ) { } public MyClass ( int initCount) : this (initCount, string .Empty) { } public MyClass ( int initCount, string name) { m_Data = (initCount > 0 ) ? new List< int >(initCount) : new List< int >(); this .name = name; } } ...