스택풀기 : 예외가 처리되지 않아서, 함수를 호출한 영역으로 예외 데이터가 전달되는 현상

-예외가 처리되지 않아서, 예외 데이터가 main함수에 도달하고, main함수에서조차 예외을 처리하지 않으면, terminate함수(프로그램을 종료시키는 함수)가 호출되면서 프로그램이 종료되어 버림

 

<처리되지 않은 예외의 전달>

-함수 내에서 함수를 호출한 영역으로 예외 데이터를 전달하면, 해당 함수는 더 이상 실행되지 않고 종료가 됨

 

 

<예외상황이 발생한 위치와 예외상황을 처리해야 하는 위치가 다른 경우>

- 이러한 경우, 예외가 발생한 원인이 되는 데이터가 외부에서 들어온 것이기 때문 예외를 외부로 넘겨서 외부에서 처리하는 것이 맞음

 

throw한 예외데이터의 자료형이 catch에서 받는 예외데이터 자료형 매개변수의 자료형과 일치하지 않는 경우

-자료형의 불일치로 인해서 예외는 처리되지 않고, 해당 함수를 호출한 영역으로 예외 데이터가 전달됨(외부로 넘겨짐)

 

 

<하나의 try블록과 다수의 catch블록>

-하나의 try블록 내에서 유형이 다른 둘 이상의 예외상황이 발생할 때 사용

 

<전달되는 예외의 명시>

-개발자가 이 함수에서 일어나는 예외는 int형, char형과 관련된 예외일거라는 표현을 하는 것

-but, 다른 자료형의 예외 데이터가 전달될 경우 termiante함수의 호출로 인해서 프로그램 종료됨(왜냐하면 프로그램을 종료시켜서 문제의 원인을 찾고 또 발생 가능한 예외의 유형을 정확히 점거하도록 유도하는 것이 훨씬 바람직해서)

 -함수의 선언에 명시되지 않은 예외가 전달되면 unexpected라는 이름의 함수가 호출되고 이 함수의 기능은 terminate  함수의 호출임

-전달되는 예외의 자료형을 명시하는 부분을 비워놓으면 어떠한 예외도 전달하지 않음을 의미함

 

C++의 예외처리 매커니즘 : 예외가 발생하면(throw절인 실행되면) , 프로그램 흐름이 중지되고, catch블록에 의해서 예외의 처리과정을 거침

 

try 블록 : 예외발생에 대한 검사의 범위를 지정할 때 사용

catch 블록 : try블록에서 발생한 예외를 처리하는 코드가 담기는 영역

 

<예시>

try

{

   //예외발생 예상지역

}

catch

{

   //예외처리 코드의 삽임

}

 

throw : throw는 예외가 발생했음을 알림

<예시>
throw expn;

-expn은 변수,상수,객체 등 표현 가능한 예외상황에 대한 정보를 담은 의미 있는 모든 데이터가 될 수 있음

 

*throw에 의해 던져진 예외데이터는, 예외데이터를 감싸는 try블록에 의해서 감지가 되어 이어서 등장하는 catch블록에 의해 처리됨

 

 

<try-catch코드>

-try블록 내에서 예외가 발생하지 않으면, catch블록은 그냥 건너 뛰고 그 다음행이 실행됨

-try블록에서 예외가 발생하면, 예외 발생지점 이후의 나머지 try영역 코드는 건너뛰고 catch블록 코드가 실행됨

 

 

try블록을 묶는기준

-예외와 연관된 부분을 모두 하나의 try블록으로 묶음

 

예외 : 프로그램 실행 도중에 발생하는 예외적 상황(프로그램 논리에 맞지 않는 상황)

 

-예외처리를 할 때 try~catch문말고 if문을 사용하면 예외처리를 위한 코드와 프로그램의 흐름을 구성하는 코드를 쉽게 구분하지 못함

-static지역변수는 템플릿 함수별로 각각 존재함

-static멤버변수는 템플릿 클래스별로 각각 존재함

 

<예시>

함수템플릿의 static변수 선언

 

template <typename T>

void ShowStaticValue(void)

{

 static T num=0;

 num+=1;

}

 

클래스 템플릿의 static변수 선언

 

*template<typename T>와 template<>의 차이

-일단, 템플릿 관련 정의에는 이 표현을 선언해서 템플릿의일부 또는 전부를 장악하고 있다는 사실을 컴파일러에게 알림

 

-template<typename T> : template과 관련있고 템플릿 매개변수가 필요한 경우

-template<> : 템플릿 매개변수가 필요없지만 template과 관련있음을 알려야 하는 경우

 

 

<템플릿 static 멤버변수 초기화의 특수화>

-클래스 템플릿 정의의 일부인 초기화문을 대상으로도 진행가능

template<>

long SimpleStaticMem<long>::mem=5;

 

템플릿 매개변수 : T1같은거

ex) template<typename T1>

템플릿 인자 : int같이 템플릿 매개변수에 전달되는 자료형 정보

ex) Apple<int>

 

템플릿 인자 예시

-템플릿 매개변수에 값을 전달받을 수 있는 변수를 선언하면, 변수에 전달되는 상수를 통해서 서로 다른 형의 클래스를 생성가능

-길이가 다른 두 배열 객체간의 대입 및 복사에 대한 부분을 이런 특징을 이용하면 신경쓰지 않아도 됨

 

 

<템플릿 매개변수 디폴트 값 지정>

Class Template Specialization : 특정 자료형을 기반으로 생성된 객체에 대해, 구분이 되는 다른 행동을 적용하기 위함

 

Class Template 코드

 

Class Template Specialization 코드

Class Template 부분 Specialization 코드

 

-템플릿 자료형 인자에 따라서 어떤 템플릿을 사용해 클래스를 만들건지 결정됨

-전체 특수화가 부분 특수화보다 우선시 됨

'Programming Language > C++' 카테고리의 다른 글

14-4 템플릿과 static  (0) 2019.06.26
14-3 템플릿 인자  (0) 2019.06.26
13-2 Class Template(클래스 템플릿)  (0) 2019.06.25
13-1 Function Template(함수 템플릿)  (0) 2019.06.25
12-1 표준 string 클래스  (0) 2019.06.25

Class Template : 클래스를 만드는 데 사용되는 template

Template Class : class template을 기반으로 컴파일러가 만들어 내는 class

 

 

<주의할점>

template사용한 클래스를 사용할 때 파일을 나누었을 때

Point.h(함수 선언)

Point.cpp(함수 정의)

PointMain.cpp(Point클래스 사용해 실행)

 

PointMain.cpp

#include "Point.h"

-이렇게만 선언되어 있으면 컴파일러는 Point.h정보 뿐 아니라 함수 정의가 담긴 Point.cpp의 정보도 필요해서 Point클래스를 만들 수 없음

-이런 이유는 파일단위 컴파일 우너칙에 의해서 PointMain.cpp를 컴파일하면서 PointTemplate.cpp의 내용을 참조하지않기 때문

 

<해결방법>

1.첫번째 방법

PointMain.cpp

#include "Point.h"

#include "Point.cpp"

//Main.cpp에 두 개 파일 모두 include

 

2.두번째 방법

-Point.h에 함수 선언 뿐 아니라 정의도 작성함

Template

-자료형에 의존받지 않기 위해 사용

-함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않음

 

Function template

-함수를 만드는데 사용되는 template

-함수 템플릿으로 다양한 자료형의 함수를 만들어냄

 

Template Function

-function template을 기반으로 컴파일러가 만들어내는 function

 

함수 템플릿 예

 

2개 이상의 type에 대해 템플릿 선언

 

 

<함수 템플릿의 특수화(Specialization of function template)>

-문자열 비교상황같이 템플릿 함수의 구성방법에 예외를 둘 필요가 생길 때 사용하는 것이 함수 템플릿의 특수화

표준 string클래스 : 문자열의 처리를 목적으로 정의된 클래스

-클래스의 사용을 위해서는 헤더파일 <string>포함해야함

 

String에 char*가 대입될 경우

-char형 배열을 생성해서 문자를 저장하려면 배열의 크기를 문자열의 끝을 알리는 null문자가 들어가기 때문에 char형 문자열의실제길이+1을 해주어야함

-char형의 strlen으로 구한문자열길이=string형을 length()로 구한문자열길이

 

 

String의 opearator+=구현(2개의 문자열을 붙일때 사용)

-strcpy_s(char* destination, rsize_t* bytesize, const char* source) : 문자열 복사 //string copy

-strcat_s(char* destination, rsize_t* bytesize, const char* source) : 문자열 합침 //string concatenate(연쇄적으로잇다)

 

String문자열 비교 함수

-strcmp(const char* str1, const char* str2) : 문자열 비교함수

 -ascii값으로 비교해서 str1<str2크면, -1 return

 -str1>str2크면, 1 return 

 -str1=str2면 0 return

 

두 String을 합쳐서 새로운 String반환

 

'Programming Language > C++' 카테고리의 다른 글

13-2 Class Template(클래스 템플릿)  (0) 2019.06.25
13-1 Function Template(함수 템플릿)  (0) 2019.06.25
10-2 단항 연산자 오버로딩  (0) 2019.01.31
10-1 연산자오버로딩  (0) 2019.01.31
09-2 다중상속  (0) 2019.01.31

1. 단항 연산자 오버로딩 코드




- *this는 객체 자신을 의미

- 반환형에 Point&는 참조값을 의미


전위증가가 계산되는 순서(1줄에 연속적으로 연산할경우)


2. 전위증가 후위증가 구분

*사용된 int는 단지 후위연산을 구분하기 위한 목적으로 선택된 것일 뿐, int형 데이터를 인자로 전달하는 뜻이 아님!


-const Point는 Point객체에 저장된 값의 변경을 허용하지 않겠다는 뜻


*++(++num)은 컴파일 허용, (num++)++은 컴파일 에러!!!



'Programming Language > C++' 카테고리의 다른 글

13-1 Function Template(함수 템플릿)  (0) 2019.06.25
12-1 표준 string 클래스  (0) 2019.06.25
10-1 연산자오버로딩  (0) 2019.01.31
09-2 다중상속  (0) 2019.01.31
09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31

+ Recent posts