객체의 모든 부분을 빠짐없이 복사하자 객체의 안쪽 부분을 캡슐화된 객체 지향 시스템 중 설계가 잘 된 것들을 보면 복사 생성자와 복사 대입 연산자 두가지가 있고, 이 둘을 통틀어 객체 복사 함수라고 부른다. 컴파일러가 생성한 복사 함수를 쓰지 않고 개발자가 직접 객체 복사 함수를 선언한다면 구현한 복사 함수가 확실히 틀린 경우에도 알려주지 않는다. 예제 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..
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..
대입 연산자는 *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 {..
객체 생성 및 소멸 과정 중, 절대로 가상 함수를 호출하지 말자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Transaction { public: Transaction() { logTransaction(); } virtual void logTransaction() const=0; }; class butTransaction: public Transaction { public: butTransaction(){}; virtual void logTransaction() const; }; void mian() { BuyTransaction b; } Colored by Color Scripter cs 상속 관계에서 생성자에 쓰이는 virtual ..
예외가 소멸자를 떠나지 못하도록 붙들어 놓자 소멸자로 부터 예외가 발생 하는 경우를 C++ 언어에서 막는 것은 아니지만, 실제 상황을 들춰보면 확실히 우리가 막을 수밖에 없다. 예제 1 1 2 3 4 5 6 7 8 9 10 11 12 13 class Widget { public: Widget(); ~Widget() {….} }; void main() { std::vector v; } cs 1. vector 타입의 객체가 v 일 경우 객체를 소멸시킬 책임은 바로 벡터에게 있다. 2. 10개의 객체 v가 vector에 있을 경우 첫 번째 객체가 소멸할 때 예외가 생기고 두 번째 객체가 또 예외가 생길 경우 C++입장에서는 감당하기 힘들다. 3. 위 2번의 일 경우 예외가 동시에 발생한 조건에 따라 프로그램 ..
다형성을 가진 기본 클래스에서는 반드시 가상 소멸자를 선언하자C++에서는 다형성을 가진 기본 클래스의 경우, 소멸자를 반드시 가상 소멸자로 선언해야 합니다. 그렇지 않으면, 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제할 때 파생 클래스의 소멸자가 호출되지 않아 메모리 누수나 불완전한 소멸 문제가 발생할 수 있습니다.기본 클래스의 비가상 소멸자를 사용할 경우, C++ 표준에 따르면 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제하는 것은 미정의 동작이 됩니다.예제 1: 비가상 소멸자의 문제점class TimeKeeper{public: TimeKeeper(); ~TimeKeeper(); // 비가상 소멸자};int main(){ TimeKeeper* ptk = getTimeKeep..
- Total
- Today
- Yesterday
- Build
- 블루버블다이브팀
- 패턴
- OpenSource
- 성산블루버블
- 네트워크 정보
- 스쿠버 다이빙
- C# 고급 기술
- 현포다이브
- 블루버블다이빙팀
- 제주도
- C
- effective
- CMake
- 서귀포
- C++
- 서귀포블루버블
- C#.NET
- 암호화
- Windows
- 스쿠버다이빙
- Linux
- script
- 블루버블
- DLL
- 울릉도
- C#
- 외돌개
- PowerShell
- Effective 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 |