12월, 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++ 에서의 객체 초기화에는 규칙이 몇 가지 있다 . 어떤 컴파일러를 막론하고 , 기본 클래...