시작은 미미하나 끝은 쥬쥬하리라.

Study/Passionate C++ Programming 17

[열혈 C++ 프로그래밍] 윤성우의 열혈 C++ 프로그래밍 내용 정리

열혈 C++ 프로그래밍 내용 정리 1. C언어 기반 C++ 1 2. C언어 기반 C++ 2 3. 클래스의 기본 4. 클래스의 완성 5. 복사생성자 6. friend, static, const 7. 상속의 이해 8. 상속과 다형성 9. 가상의 원리와 다중상속 10. 연산자 오버로딩 1 11. 연산자 오버로딩 2 12. string 클래스 디자인 13. 템플릿 1 14. 템플릿 2 15. 예외처리 16. C++ 형 변환자 윤성우의 열혈 C++ 프로그래밍 - 예스24 2004년도에 출간된 윤성우 저자 「열혈강의 C++ 프로그래밍」의 개정판이다. C언어를 이해하고 있는 독자들을 대상으로 한 C++ 기본서로서, 초보자에게 적절한 설명과 예제를 통해서 C++ 학습에 재 www.yes24.com 교재 : 운성우의 열..

[열혈 C++ 프로그래밍] (16) C++ 형 변환자

C언어 기반 C++ 2 형 변환 연산1 형 변환 연산2 형 변환 연산3 형 변환 연산1 C++ 형 변환 다운 캐스팅 등 문법적으로 에러가 있더라도 컴파일 에러를 일으키지 않고 형 변환 연산 처리 C++의 형 변환 : 4가지의 종류로 분할하여 사용 -> 각 종류 별 케이스에 일치하지 않으면 컴파일 에러 발생, 문법적 오류 발견 가능 1. static_cast 2. const_cast 3. dynamic_cast 4. reinterpret_cast dynamic_cast(안전성 보장) static_cast(안전성 미 보장) 형 변환 연산2 dynamic_cast 포인터 또는 참조자를 T형으로 변환하되, 안전한 형 변환만을 허용 ex) B클래스의 기초 클래스 A클래스일 때, B클래스의 포인터를 A클래스의 포인..

[열혈 C++ 프로그래밍] (15) 예외처리

예외처리 예외 상황, 예외 처리 예외처리 메커니즘 Stack Unwinding 예외상황 표현하는 예외 클래스 설계 예외처리 예외 상황, 예외 처리 예외 상황 문법적 오류가 아닌 프로그램 논리에 맞지 않는 오류 ex) 나이 입력 : 0보다 작은 값 입력 -> 예외 상황 예외 처리 조건문을 통해 예외를 발견하고 처리가 가능하지만 이러한 방식은 예외처리부와 일반 코드를 쉽게 구분 불가 -> C++에서 별도 메커니즘 제공 : try, catch, throw 예외처리 메커니즘 try, catch, throw try 블록에서 발생한 예외는 catch 블록에서 처리 try : 예외 발생의 검사 범위를 지정, 예외가 발생할 가능성이 있는 코드 블록 catch : try블록에서 발생한 예외를 처리, 예외 핸들러가 처리할..

[열혈 C++ 프로그래밍](14) 템플릿 2

템플릿 2 내용 확장 클래스 템플릿의 특수화 템플릿 인자 템플릿과 static 내용 확장 const 변수, 객체의 상수화 키워드 클래스 템플릿의 특수화 템플릿 컴파일러가 클래스를 만드는데 사용되는 템플릿을 정의 -> 컴파일러가 템플릿을 확인하고 템플릿 기반 클래스를 생성 -> 템플릿 클래스에서 객체를 생성 BoundCheckArray iarr(50); BoundCheckArray oarr(50); -> 와 같이 객체 생성 가능 Point int형 : BoundCheckArray로 객체 생성 -> typedef Point* POINT_PTR; = BoundCheckArray oparr(50);과 동일 + 템플릿 클래스 자료형을 대상으로 일반함수 정의 가능 + 클래스 템플릿 내부에서 일반 함수를 대상으로 f..

[열혈 C++ 프로그래밍] (13) 템플릿 1

템플릿 1 템플릿과 함수 템플릿1 템플릿과 함수 템플릿2 클래스 템플릿 템플릿 일부만 결정되어 있고 나머지는 사용하는 순간에 결정되는 것 -> 함수의 기능은 결정되어 있지만 자료형이 결정되어있지 않고 의존적이지 않은 것 int add(int a, int b) { return a+b } -> double형 데이터를 대상으로 연산하지 못함 -> double형 데이터를 int형으로 캐스팅하여 연산 할 수 있지만 데이터 손실 발생 -> double형 데이터 연산을 하는 함수 작성 필요 -> 자료형 마다 함수를 추가 작성하는 것이 비효율적이라서 템플릿 사용 T add(T a, T b) { return a+b } -> 함수 템플릿 -> T가 어떤 것인지 컴파일러가 알 수 있게 명시 + template {typena..

[열혈 C++ 프로그래밍] (12) String 클래스 디자인

String 클래스 디자인 C++표준, string클래스 문자열 처리 클래스 C++ 표준, string 클래스 String 문자열 처리를 위해 제공되는 클래스, string.h 헤더 파일을 포함해야 사용 가능 string str1 = "a"; string str2 = "b"; string str3 = str1 + str2; -> str1.operator+(str2);를 호출 : operator+() 함수는 string.h 헤더 파일에 정의 -> operator+() 이외에도 문자열과 관련한 operator+=(), ==() () 등의 함수가 정의 문자열 처리 클래스 length() 문자열의 길이를 반환하는 stirng 메소드 size()메소드도 길이를 반환하고 같은 값을 반환하지만, size는 객체가 메..

[열혈 C++ 프로그래밍] (11) 연산자 오버로딩 2

연산자 오버로딩 2 대입 연산자의 오버로딩 배열의 인덱스 연산자 오버로딩 연산자 오버로딩1 연산자 오버로딩2 연산자 오버로딩3 대입 연산자의 오버로딩 대입 연산자 오버로딩 객체 간의 대입 연산은 대입 연산자의 호출로 이어짐 -> 직접 대입 연산자를 정의해주지 않으면 디폴트 대입 연산자 호출 -> 디폴트 대입 연산자는 멤버 대 멤버의 복사를 수행 a1 = a2; -> 일반적으로 객체 간 대입을 불가하지만 a1.operator=(a2)로 해석, 디폴트 연산자 호출 Point pos1(5,7); Point pos2 = pos1; -> 객체 간 복사(복사 생성자 호출) Point pos1(5,7); Point pos2(9,10); -> 대입 연산자 호출 문제점 : 동적 할당하는 경우, 같은 메모리 공간을 참조 ..

[열혈 C++ 프로그래밍] (10) 연산자 오버로딩 1

연산자 오버로딩 1 연산자 오버로딩 단항 연산자의 오버로딩 교환법칙 문제 해결 cout, cin, endl 연산자 오버로딩 하나의 연산자를 여러 의미로 사용할 수 있게 해주는 것 -> 객체 간 불가능한 연산을 사용자가 정의를 한 것을 토대로 객체 간 연산을 가능하게 만듬 p1.operator+(p2); -> p1 객체를 대상으로 p2를 인자로 함수를 호출 p1 + p2 => operator+(p1, p2); 주의점: 1. 연산자의 우선순위와 결합성을 불변 2. 매개변수의 디폴트값 설정 불가 3. 연산자의 순수 기능 변경 불가 -> ex) operator+() { num1*num2 } : 객체가 아닌 변수간 단순 덧셈 - Position 생성자와 operator-() 함수를 정의 - operator-() ..

[열혈 C++ 프로그래밍] (9) 가상의 원리와 다중상속

가상의 원리와 다중상속 멤버함수와 가상함수 다중상속 멤버함수와 가상함수 멤버 함수 물리적으로 메모리의 한 공간에 별도로 위치하여 함수가 정의된 클래스의 모든 객체가 메모리를 공유하는 형태 -> 논리적으로는 객체 안에 멤버 함수 존재 멤버 객체 객체가 생성되면 멤버 객체는 객체 메모리 공간 멤버 객체 객체가 생성되면 멤버 객체는 객체 메모리 공간 내부에 생성 가상함수 동작원리 1. 가상함수가 멤버로 포함 2. 가상함수 V-Table이 생성 3. 함수를 호출하는 경우 V-Table을 참조 -> 가상함수 테이블을 클래스별로 생성 : A클래스 테이블에는 B클래스 가상함수 정보가 없음 -> 가상함수 오버라이딩의 경우 유도 클래스의 V-Table에서 기초 클래스의 가상함수가 가려짐 -> 기초 클래스의 가상 함수가 ..

[열혈 C++ 프로그래밍] (8) 상속과 다형성

상속과 다형성 객체 포인터와 참조 가상함수 가상 소멸자와 참조자의 참조 가능성 객체 포인터와 참조 객체 포인터 기초 클래스의 포인터로 유도 클래스의 객체를 호출 가능 : 유도 클래스 내부의 기초 클래스 멤버만 호출 가능 -> 유도 클래스에서 상위 클래스인 기초 클래스의 객체를 참조하는 것은 불가능 : 대부분의 상황에서 X - Person Student 클래스 내부의 Person 멤버를 가리키 고 있으므로 KIm 객체로 Sleep함수를 가리키면 Sleep 출력 - Person* Park = new PartTimeStudent; -> PartTimeStudent 클래스를 대상으로 새로운 Person형 포인터 객체 생성 : Park -> PartTimeStudent 클래스 내부의 Person 멤버 를 가리키고..