티스토리

HaeJuK LABS
검색하기

블로그 홈

HaeJuK LABS

drdbg.com/m

다이빙하는 개발자

구독자
0
방명록 방문하기

주요 글 목록

  • 항목 3 ] 함수 호출 규약 C++ 함수 호출 규약 (calling conventions)은 함수 호출 시 함수 인자와 반환값을 처리하는 방식을 정의하는 규칙입니다. 호출 규약은 컴파일러와 링커가 일관되게 함수 호출을 처리하도록 합니다. 다음은 주요 호출 규약의 종류, 설명, 차이점, 예제 코드, 그리고 간단한 어셈블리 코드 예제입니다.1. cdecl (C Declaration)설명: 기본 C 호출 규약으로, 인자는 오른쪽에서 왼쪽으로 스택에 푸시됩니다. 함수 호출자가 스택을 정리합니다.장점:유연성: 가변 인수 함수에서 사용 가능.호출 규약의 일관성: C와 C++에서 많이 사용되어 표준화됨.디버깅 편리성: 호출자가 스택을 정리해 디버깅이 쉬움.int __cdecl add(int a, int b) { return a + b;}p.. 공감수 0 댓글수 0 2013. 6. 11.
  • 항목 38 ] “has – a(…는 …를 가짐)” 혹은 is – implemented-in-terms-of(…는 …를 써서 구현됨)”를 모형화할 때는 객체 합성을 사용하자 모형화할 때는 객체 합성을 사용하자 합성(composition)이란, 어떤 타입의 객체들이 그와 다른 타입의 객체들을 포함하고 있을 경우에 성립하는 그 타입들 사이의 관계를 일컫습니다. 포함된 객체들을 모아서 이들을 포함한 다른 객체를 합성한다는 뜻인데, 다음과 같은 경우입니다. 문제점 1 2 3 4 5 6 7 8 9 10 11 12 13 class Address { …. }; // 누군가의 거주지 class PhoneNumber { …. }; class Person { public: private: std::string mane; // 이 클래스를 이루는 객체 중 하나 Address address; // 마찬가지 PhoneNumber voiceNumber; // 역시 마찬가지 PhoneNumber fa.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 37 ] 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재 정의하지말자 상속받은 기본 매개변수 값은 절대로 재 정의하지 말자 C++에서 상속받을 수 있는 함수: 가상, 비가상 함수 상속되는 함수는 동적으로 바인딩 된다., 기본 매개변수는 정적 바인딩된다. 가상 함수는 동적으로 바인딩되지만, 런타임 효율성 때문에 기본 매개변수 값은 정적으로 바인딩된다. 동적 바인딩은 늦은 바인딩(late binding)이라고도 불리는데, 객체가 실행 시 그 순간의 상태에 따라 일어난다. 프로그래밍에서 변수들은 정수나 문자열 등 형태에 따라 그 변수에 저장되는 값의 저장방법이나 조작방법이 달라진다. 전통적인 컴파일러들이나 어셈블러들은 컴파일 시점에 변수의 형식을 할당하는 정적 바인딩을 제공하였으나, 객체지향 언어들은 실행 시 키보드 또는 기타 다른 소스로부터 값이 변수에 들어오는 그 순간에 변.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 36 ] 상속받은 비 가상함수는 재정의하면 안된다 상속받은 비 가상 함수는 재정의하면 안 된다 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 35 36 37 #include class A { public: void f() { std::cout 총평 public 상속은 is-a 관계입니다. 그리고 비가상 함수는 클래스 파생에 관계없는 불변 동작을 정해주는 것입니다. 즉 불변의 동작을 원하여 만든 함수를 파생 클래스에서 다시 정의하면 이것이 목적이 있어 다시 정의하는 것이라면 결국 비 가상 함수를 쓸 이유가 전혀 없다는 것입니다. 결국. 목적이 있어 다시 정의하는 함수 일 경우에는 가상함수를 쓰는 것 이 좋습니다. 결국에는 비 가상 함수는.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 35 ] 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자. 1) 비가상 인터페이스 관용구(non-virtual interface)를 사용하자. - 공개되지 않은 가상 함수를 비가상 public 멤버 함수로 감싸서 호출하는, 템플릿 메서드 패턴의 한 형태 - NVI에서 가상 함수가 엄격하게 public 일 필요는 없다. - 장점 : 가상 함수가 호출되기 전에 어떤 상태를 구성하고 가상 함수가 호출된 후에 그 상태를 없애는 작업을 래퍼를 통해 공간적으로 보장된다. *비가상 인터페이스 관용구(non-virtual interface)란? - 사용자로 하여금 public 비가상 멤버 함수를 통해 private 가상 함수를 간접적으로 호출하게 만드는 방법. - 관용구에 쓰이는 비가상 함수는 가상함수의 래.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 34 ] 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자. 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자. 인터페이스 상속과 구현 상속은 무엇을 의미하는가? 기본 클래스의 멤버 함수의 상속 방법을 두고 하는 말이다. 인터페이스 상속과 구현 상속의 차이점은 무엇인가? 인터페이스 상속이란, 순수 가상 함수의 상속을 말한다. 구현 상속이란, 가상 함수와 비가상 함수의 상속을 말한다. 각 함수들은? 순수 가상 함수 : 가상 함수이나, 함수의 정의 부분이 없고, 선언 부분만 있는 함수 가상 함수 : 파생 클래스에서 가상 함수를 받는 함수가 없다면, 기본 클래스 함수가 호출되고 있다면, 파생 클래스의 가상 함수를 호출시켜주는 매체가 되는 함수 비 가상 함수 : 일반 멤버 함수, 예제 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 33 ] 상속된 이름을 숨기는 일은 피하자. 상속된 이름을 숨기는 일은 피하자. 파생 클래스의 이름은 기본 클래스의 이름을 가린다. Scope (유효 범위) 1 2 3 4 5 6 int x; // 전역 변수 void someFunc() { double x; // 지역 변수 std::cin >> x; // 입력을 받아, 지역 변수 x에 새 값을 읽어 넣음 } Colored by Color Scripter cs *안쪽 유효 범위에 있는 이름이 바깥쪽 유효범위에 있는 이름을 가림 상속 부모 클래스에 속해 있는 것을 자식 클래스 멤버 함수 안에서 참조하는 문장이 있으면 컴파일러는 참조 대상을 바로 찾아낼 수 있음 자식 클래스의 유효 범위가 부모 클래스의 유효 범위 안에 중첩되어있음 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 32 ] public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자. 상속 모형은 반드시 "is-a" • 클래스 D(Derived)를 클래스 B(Base)로부터 public 상속을 통해 파생시켰다 • D 타입으로 만들어진 모든 객체는 또한 B 타입의 객체이지만, 그 반대는 되지 않음 • B 타입의 객체가 쓰일 수 있는 곳에는 D 타입의 객체도 마찬가지로 쓰일 수 있다고 단정 • D 타입이 필요한 부분에 B 타입의 객체를 쓰는 것은 불가능 • 모든 D는 B의 일종이지만, B는 D의 일종이 아님 • C++는 public 상속을 이렇게 해석하도록 문법적으로 지원 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Person {...}; class Student: public Person {...}; // 모든 학생은 사람이지만 모든.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 31 ] 파일 사이의 컴파일 의존성을 최대로 줄이자. 파일 사이의 컴파일 의존성을 최대로 줄이자. 클래스 하나만 추가해서 빌드를 했더니 건들지도 않은 부분도 컴파일되고 다시 링크된다. C++가 인터페이스와 구현을 깔끔하게 분리하지 못하기 때문입니다. C++의 클래스 정의는 클래스 인터페이스만 지정하는 것이 아니라 구현 세부사항까지 지정하고 있습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Person { public: Person(const std::string&name, const Date& birthday, const Address& addr); std::string name() const; std::string birthDate() const; std::string address() const; private:.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 30 ] 인라인 함수는 미주알고주알 따져서 이해해 두자 인라인 함수는 미주알고주알 따져서 이해해 두자 인라인 함수의 정의 함수 호출 문을 그 함수의 본문으로 바꿔치기하는 함수. 컴파일러에 대한 개발자의 요청으로 무시될 수도 있다. inline 함수 1 2 3 4 5 6 7 8 9 10 11 12 13 inline void foo() { cout 잘못된 인라인은 예외 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Base { public: private: std::string bm1,bm2; }; class Derived : public Base { public: Derived() {} // 비어 있지만 컴파일러가 만들어 내는 코드가 있다. private: std::string bm1,bm2,bm3; }; Colored by Color .. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 29 ] 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 예외 안전성이란 무슨 말인가? "예외적 상황에 대해서 안전한가?"에 대한 말이다. 왜 확보해야 하는가? 코딩중에 컴파일타임에 에러를 다 찾아내면 좋겠지만, 컴파일 타임에 찾지 못하는 에러들은 정말 찾기가 힘들어진다. 그렇기 때문에, 예외적 상황에 대해서 대처를 해야지만 디버깅이 용이해지고, 프로그램 자체도 더 견고해지기 때문에 확보해야 한다. 함수들의 예외 안전성은 어떻게 동작해야 하는가? 1. 자원이 절대 새도록 만들지 않는다. 2. 자료구조가 더렵혀지는 것을 허용하지 않는다. 그렇다면, 예외 안전성을 갖춘 표준 보장은 무엇인가? 1. 기본적인 보장(basic guarantee) : 예외 발생에 있어, 자원 누수를 시키지 않겠다는 보장 2. 강력한 .. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 28 ] 내부에서 사용하는 객체에 대한 ‘핸들’을 반환하는 코드는 되도록 피하자 내부에서 사용하는 객체에 대한 ‘핸들’을 반환하는 코드는 되도록 피하자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //점을 나타내는 클래스 class Point { public: void setX(int newVal); void setY(int newVal); }; //Rectangle에 쓰기 위한 점 데이터 struct RectData { Point ulhc; //ulhc = “좌측 상단(upper left – hand corner)” Point lrhc; //lrhc = “우측 하단(lower right – hand corner)” }; class Rectangle { private: std::tr1::shared_ptrpData; //tr1::shared_ptr.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 27 ] 캐스팅은 절약, 또 절약! 잊지 말자. 캐스팅은 절약, 또 절약! 잊지 말자. 책에 있는 예제들은 소스 코드가 이해하기 힘든 관계로 퍼오거나 직접 만들었습니다. 하지만 책에 있는 예제들 전부 빼놓지 않고 넣어 놨습니다 우선 쉬운 예로 시작하다가 책의 예제로 이어 가겠습니다. 책에 있는 내용을 추가 한거라고 생각 하시면 됩니다. 복습 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 26 ] 변수정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 변수정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 변수 정의를 늦출수 있게 된것은 C++의 어디에서건 변수를 선언 할수 있게 만들어 줌으로써 생겨난 방법일것이다. 가장 큰 이유는 변수의 생성 대입 초기화 라는 작업이 일어날 필요가 없게 될 경우가 생기기 때문이다. 예를 들어서, 아주 큰 객체를 생성하여 대입하고 하고, 특정 함수를 작업하고, 다시 선언된 큰 객체를 사용하고 날려 버리는 작업이 있다고 했을때, 특정 함수에서 오류가 나서 이 객체를 쓰지도 못하게 되었다고 한다면 이해가 쉽게 갈것이다 예제 1 1 2 3 4 5 6 7 8 9 10 11 12 void main() { string encrypted; if(password.lengh() 결론 변수 정의는 늦출 수 있을 때까지 늦추자. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 25 ] 예외를 던지지 않는 SWAP에 대한 지원도 생각해 보자 예외를 던지지 않는 SWAP에 대한 지원도 생각해 보자 타이틀 입력부분C++에서 SWAP 이란 두 객체의 값을 ‘맞바꾸기’한다는 것을 말함. 기존의 SWAP의 동작을 보면 1 2 3 4 5 6 7 8 9 10 11 12 13 namespace { void swap(int a,int b) { int temp; Temp = a; a = b; b = temp; } } cs 어김없이 동작을 하게 되어있습니다. 하지만 예외의 swap의 동작을 요구하는 swap도 있습니다. 예제1 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 class AA { public: private: int a,b,c; std::vectorv; }; c.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 24 ] 타입변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 타입변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 유리수가 선 객체일경우 operator를 사용하면 에러가 뜬다. 문제점 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 35 class Rational { public: Rational(int num = 0, int num1 = 1); //explicit붙이지 않는 이유는 int에서 Rational로의 암시적 변환을 허용하기위해… const Rational operator*(const Rational& rhs ) const; }; void main() { Rational Eighth(1, 8); Rational Ha.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 23 ] 맴버 함수보다는 비멤버 비프랜드 함수와 더 가까워지자 맴버 함수보다는 비멤버 비프랜드 함수와 더 가까워지자 비 멤버함수로 구현한 것이 캡슐화 정도가 더 좋기 때문이다. 어떤 객체의 데이터에 접근할 수 있는 코드가 적을수록 캡슐화가 잘 되어 있는 것이라 할 수 있다. 외부에서 변경 불가능한 영역이 넓을수록 외부와 관계가 적으며, 그로인해 내부 구현이 바뀌더라도 외부에 많은 영향을 주지 않음. 멤버함수는 객체의 private영역까지 접근할 수 있다. 그러나 비멤버함수는 public영역 외에는 접근이 불가능하므로, 그 객체의 데이터에 직접적으로 접근할 여지가 줄어든다. 따라서 캡슐화가 멤버함수에 비하여 잘된 것이라 할 수 있음. 주의할 것은 이러한 비멤버함수의 이점은 비프렌드 함수일 때만 적용된다. 프렌드 함수는 접근권한이 멤버함수와 같으므로 캡슐화 정도도 똑같.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 22 ] 데이터 멤버가 선언될 곳은 private 영역임을 명시하자. 데이터 멤버가 선언될 곳은 private 영역임을 명시하자. 데이터 멤버를 public에 선언할 경우 어디에서든지 누구나 데이터에 접근할수 있기 때문에, 읽기, 쓰기, 접근권한을 갖게 되지만, 이 값을 읽고 쓰는 함수가 있으면 접근 불가, 읽기 전용, 읽기 쓰기 접근을 여러분이 직접 구현할 수 있습니다. 심지어 쓰기 전용 접근도 필요하다면 구현 할 수 있습니다. 세밀한 통제 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 class AccessLevels { public: int getReadOnly()const { return readOnly; } void setReadWrite( int value ) { readWrite = .. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 21 ] 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자. 함수에서 객체를 반환해야 할 경우에 참조자를 반환하지 말자. 참조자를 왜 반환해도 되지 않나? 매개변수가 참조자이고, 그 참조자를 반환하는 경우에는 상관이 없다. 하지만, 함수 내부에서 선언된 객체의 경우에는 크게 잘못 된다. 이유? 스택에 올라간 객체는 존재 할수 있는 범위(Scope)가 있다. 함수 내부에 선언(스택에 올려진)된 객체의 경우, 함수 종료 후 사라진다. 그러므로 안에 있던 객체를 참조자로 리턴하게되면 문제가 발생한다. 함수에서 객체를 반환하는 경우, 임시 객체를 생성하는 것을 피하기 위해 참조자를 반환하려고 시도하는 경우가 있다. 그러나 그것은 옳은 방법이 아니다. 참조자라는 것은 이미 존재하는 객체에 대한 별칭과 같은 것이다. 함수에서 스택에 임시로 생성된 객체에 대해 참조자를 반환하.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 20 ] '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달' 방식을 택하는 편이 대개 낫다 '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달' 방식이 대개 낫다 CALL BY REFERENCE vs CALL BY VALUE 사본을 주고받는 값에 의한 전달은 고비용의 연산이다. 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 class Person { public: Person(); virtual ~Person(); private: std::string name; std::string address; }; class Student : public Person { public: Student(); virtual ~Student(); private: std::string schoolName; .. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 19 ] 클래스 설계는 타입 설계와 똑같이 취급하자. 클래스 설계는 타입 설계와 똑같이 취급하자. C++에서 새로운 클래스를 정의 한다는 것은 새로운 타입을 하나 정의하는 것과 같습니다. 함수와 연산자를 오버로드하고, 메모리 할당 및 해제를 제어하며, 객체 초기화 및 종료정리를 정의하는 작업, 이 모두가 여러분의 손에 달려 있습니다. 좋은 타입이란 문법이 자연스럽고, 의미구조가 직관적이며, 효율적인 구현이 한 가지 이상 가능해야 합니다. 효과적인 클래스를 설계하기 위해 고려해야 할 사항 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 이 부분에 따라 클래스 생성자 및 소멸자의 설계가 바뀝니다. 메모리 할당 함수를 직접 작성 할 경우에는 이들 함수의 설계에도 영향을 미칩니다. (operator new, operator new[], oper.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 18 ] 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게하자. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게하자. 인터페이스는 c++에서 쓰이는 함수, 클래스, 템플릿 등을 모두 포괄하는 의미이다. 사용자가 저지를 수 있는 오류에는 여러가지가 있고, 개발자는 그러한것들을 최대한 줄일 수 있도록 여러 안전 장치들을 마련해 놓을 필요가 있다. 예제 1 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 .. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 17 ] new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자. new를 사용하여 생성한 객체를 스마트 포인터등에 저장 할 때 단계가 많거나 복잡할 수 록 메모리 누수가 발생 할 수 있다. 예제 1 1 2 3 4 5 6 7 8 9 10 11 12 //우선 순위를 알려 주는 함수 int priority(); //동적으로 할당한 Widget객체에 대해 어떤 운선순위에 따라 처리를 적용하는 함수 void processWidget(std:tr1::shared_ptrpw, int priority); void main() { processWidget(std:tr1::shared_ptr(new Widget),priority()); } Colored by Color Scripter cs 어디서든 잘.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 16 ] new 및 delete를 사용할 때는 형태를 반드시 맞추자 new 및 delete를 사용할 때는 형태를 반드시 맞추자 동적할당 연산자 new, delete를 사용 할 때 형태를 일치 시켜야한다. 사용법 int* pnCount = new int; delete pnCount; int* pArryCount = new int[100]; delete [] pArryCount; 예제 1 std::string *pStringArray = new std::string[100]; delete pStringArray; 위 코드와 같이 사용하면 pStringArray가 가리키는 100개의 string 객체들 가운데 99개는 정상적인 소멸 과정을 거치지 못합니다. new를 사용하여 동적 메모리가 할당을 시도하게 되면 그 과정에서 std::string()의 생성자는 할 당 된 수 만큼.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 15 ] 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자. 자원관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 항목 13에서 가져온 예제 void main() { std::tr1::shared_ptr pInv(createInvestment()); // 투자금이 유입된 이후로 경과한 날수 int dayHeld(const Investment *pi); // 에러 int days = daysHeld(pInv); /* daysHeld함수는 Investment * 타입을 원하는데 std::tr1::shared_ptr타입의 객체를 넘기고 있음 std::tr1::shared_ptr을 Investment *로 변환하고 싶어짐 */ } Colored by Color Scrip.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 14 ] 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자. 자원관리 클래스의 복사 동작에 대해 진지하게 고찰하자. 객체 복사에서는 컴파일러가 제공하는 디폴트 함수(복사 생성자, 대입연산자등)가 자신이 원하는 동작을 못한다면 직접 설계하여야 한다. 힙 기반 자원 관리의 스마트 포인터는 힙에 생기지 않는 자원의 처리로는 부적합하다. 이 경우 자원 관리 클래스를 만들어야 할 필요성이 있다. 예제 Mutex 타입의 동기화 객체의 잠금과 해지 클래스 생성 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 void lock(Mutex *pm); // pm이 가리키는 뮤텍스의.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 13 ] 자원 관리에는 객체가 그만! 자원 관리에는 객체가 그만!1234567891011121314151617181920//여러 형태의 투자를 모델링한 클래스 계통의 최상위 클래스class Investment { . . . };    /*Investment  클래스 계통에 속한 클래스의 객체를  동적 할당하고 그 포인터를 반환합니다.  이 객체의 해제는 호출자 쪽에서 직접 해야 합니다.*/Investment* createInvestment(); void f(){    //팩토리 함수를 호출합니다.    Investment *pInv = createInvestment();           // pInv를 사용합니다.         // TODO            // 객체를 해제합니다.                              .. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 12] 객체의 모든 부분을 빠짐없이 복사하자 객체의 모든 부분을 빠짐없이 복사하자 객체의 안쪽 부분을 캡슐화된 객체 지향 시스템 중 설계가 잘 된 것들을 보면 복사 생성자와 복사 대입 연산자 두가지가 있고, 이 둘을 통틀어 객체 복사 함수라고 부른다. 컴파일러가 생성한 복사 함수를 쓰지 않고 개발자가 직접 객체 복사 함수를 선언한다면 구현한 복사 함수가 확실히 틀린 경우에도 알려주지 않는다. 예제 1 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 void logcall(const std::string& funcName); //로그 기록내용을 만든다. class Customer { public: Customer(const Customer& rhs); Customer& operat.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 11] operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자. Operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자. 타이틀 입력부분C++ 연산자 operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자. 자기대입(중복참조,자기참조)은 같은 객체를 참조 할 수 있는 위험이 있다. 자기참조,자기대입(Self Assignment)이란? 객체가 자신에 대해 대입 연산자를 적용하는 것을 말합니다. ex)중복참조: 여러 곳에서 하나의 객체를 참조하는 상태 예제 1 2 3 4 5 6 Widget& Widget::operator=(const Widget& _rhs) { delete pb; //현재의 비트맵 사용을 중지합니다. pb = new Bitmap(*_rhs.pb); //이제 rhs의 비트맵을 사용하도록만듭니다 return *this; //*thi.. 공감수 0 댓글수 0 2010. 3. 8.
  • 항목 10] 대입 연산자는 *this의 참조자를 반환하게 하자 대입 연산자는 *this의 참조자를 반환하게 하자 대입 연산은 우측연관(Right Associative) 연산이다. 1 2 3 4 5 6 void main() { int x, y, z; x = y = z = 15; x = ( y = ( z = 15 ) ); } cs 위와 같이 대입연산의 경우 우측부터 대입이 사슬처럼 이어진다. 좌변 객체의 참조자를 반환하게 만들자 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 class Widget { private : int m_nData; public : void Set(const int _nValue) { m_nData = _nValue; } int Get() const {.. 공감수 0 댓글수 0 2010. 3. 8.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.