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

1. 연산자 오버로딩


Overloading :  함수의 이름은 하나이지만 기능은 여러가지


1) 연산자 오버로딩 코드

-다음 그림과 같이 두 가지 형태로 표현할 수 있다


2)연산자 Overloading의 방법 

1)Member Function에 의한 방법

2)Global Function에 의한 방법



*만약 동일한 자료형을 대상으로 +연산자를 Global Function기반으로,그리고 Member Function기반으로 동시에 Overloading 할 경우, 

Member Function으로 Overloading된 함수가 우선시됨


3) 연산자 Overloading이 불가능한 연산자 종류


4) 연산자 오버로딩 하는데 있어서 주의사항


*연산자의 기본 기능을 변경하는 형태의 연산자 Overloading은 허용안됨








1. 다중상속 


다중상속 : 둘 이상의 Class를 동시에 상속하는 것


2. 다중상속의 모호성

-다음 코드와 같이 상속한 Class들에 같은 이름을 가진 Function이 존재할 경우 호출의 대상을 구분해서 명시해야함


3. 가상 상속(Virtual Inheritance)


-다중상속을 하게되면 위의 구조와 같이 Base Class를 2번 간접 상속을 하게 된다.


-다중상속을 한 Class멤버는 2번 간접 상속을 하여 Base Class의 같은 멤버함수가 2개 존재하는 상태


-이를 해결하기 위해서 Virtual Inheritance(가상 상속)을 하게 되면 Base의 멤버함수가 1개만 상속되게 됨

-또한, Base Class의 생성자가 한번만 호출됨(Derived Class의 객체 생성시)



1. Member Variable은 Object내에 존재하지만, Member Function은 Memory의 한 공간에 별도로 위치하고선, 이 Function이 정의된 Class의 모든 Object가 이를 공유하는 형태를 취함



-다음 그림과 같이 두개의 구조체 variable(객체)가 Function을 공유하고 있음


2. 가상함수의 동작원리와 가상함수 테이블(V-Table, Virtual Table)


-한 개 이상의 Virtual Function을 포함하는 Class에 대해서는 Compiler가 Virtual Table을 만듬


-Overriding된 Virtual Function의 주소정보는 Derived Class의 Virtual Table에 포함되지 않음


그림은 AAA를 BBB가 상속하는 상황


-main함수가 호출되기 이전에 다음의 구조로 Virtual Table이 메모리 공간에 할당됨( Virtual Table은 객체의 생성과 상관없이 메모리 공간에 할당됨)


-Virtual Function을 하나이상 Member로 지니는 Class의 Object에는 Virtual Table의 주소 값이 저장됨

-BBB Class의 Virtual Table을 살펴보면, Overriding된 AAA  Class의 Func1 함수에 대한 정보가 없음을 알 수있음, BBB Class의 Func1함수가 대신 호출되는데, 이것이 Virtual Function의 호출원리


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

10-1 연산자오버로딩  (0) 2019.01.31
09-2 다중상속  (0) 2019.01.31
08-3 가상 소멸자와 참조자의 참조 가능성  (0) 2019.01.29
08-2 가상함수  (0) 2019.01.29
08-1 객체 포인터의 참조관계  (0) 2019.01.15

1. 가상 소멸자 ( Virtual Destructor )


-위와 같이 Second Class를 생성하게 되면 First Class와 Second Class의 Constructor가 나란히 호출되고 나중에 소멸될 때 First Class(Base Class)의 할당을   해제하면 Second Class의 Destructor가 호출되지 않는 문제가 발생함

-이를 위해 First Class(Base Class)의 Destructor에 Virtual선언을 해주어, 이를 상속하는 Derived Class의 Destructor도 모두 Virtual Destructor로 선언이됨

 그리고 Virtual Destructor가 호출되면(Base Class의) 상속의 계층구조상 맨 아래에 존재하는 Derived Class의 Destructor가 대신 호출되고 그 다음 Base   Class의 Destructor가 순차적으로 호출됨


*상속관계에 있는 Class의 Constructor와 Destructor 호출 순서

First Class의 Constructor 호출 -> Second Class의 Constructor호출 -> Second Class의 Destructor호출 -> First Class의 Destructor호출


2. 참조자의 참조 가능성

* C++에서, AAA형 참조자는 AAA형 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 참조할 수 있음



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

09-2 다중상속  (0) 2019.01.31
09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31
08-2 가상함수  (0) 2019.01.29
08-1 객체 포인터의 참조관계  (0) 2019.01.15
07-4 상속을 위한 조건  (0) 2018.01.22

1. C++ compiler는 포인터 연산의 가능성 여부를 판단할 때, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.


- Derived class가 Base class를 상속하는 관계


2. 포인터 형에 해당하는 클래스에 정의된 멤버에만 접근이 가능함



*그림과 같이 클래스는 자신안에 있는 멤버만 볼 수 있기 때문에 위의 코드가 컴파일이 되지않음



3. 가상함수 ( Virtual Function)


-가상함수는 C++의 개념이 아닌 객체지향의 개념임



-함수가 가상함수로 선언되면, 포인터 변수가 실제로 가리키는 객체를 참조하여 가장 최근에 Overriding된 함수를 호출함

-Virtual Function이 선언되고 나면 이 함수를 Overriding하는 함수도 Virtual Function이 됨

-Overriding함수에 virtual선언을 추가하지 않아도 Virtual Function이 되지만 virtual선언을 넣어서 함수가 Virtual Function임을 알리는 것이 좋음


4. 상속을 하는 이유

-상속을 통해 연관된 일련의 클래스에 공통적인 규약을 정의할 수 있음 (이게 중요!)

-재활용


5. 순수 가상함수(Pure Virtual Function)와 추상 클래스(Abstract Class)

-Pure Virtual Function : 함수의 몸체가 정의되지 않은 함수

-명시적으로 몸체를 정의하지 않았음을 컴파일러에게 알림

-Abstract Class : 하나 이상의 멤버함수를 순수 가상함수로 선언한 클래스를 가리켜 추상 클래스라 함


*Class 중에서는 객체생성을 목적으로 정의되지 않는 Class도 존재함, 이런 Class의 객체생성을 컴파일러 단계에서 방지하기 위해

Virtual Function을 Pure Virtual Function으로 선언함



-Pure Virtual Function을 선언하는 방식 , main에 보면 First Class의 객체생성을 컴파일러가 금지하고 있음


6. 다형성(Polymorphism)

-C++에서 문장은 같은데 결과는 다른 경우


- 두 문장은 형식은 같지만 결과는 다르게 출력함



상속의 목적

1. 재활용(코드)

2. 확장성( 다른 클래스가 추가 되었을 때)

 

객체 포인터 변수 : 객체의 주소 값을 저장하는 포인터 변수

 

1. C++에서, AAA형 포인터 변수는 AAA객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다(객체의 주소값을 저장할 수 있다.)

 

 

2. 상속에서의 함수 Overriding

 

*주의할점

Base class와 동일한 이름의 함수를 Derived class에서 정의한다고 해서 무조건 Function Overriding이 되는 것은 아님. 

매개변수의 자료형 및 개수가 다르면, 이는 Function Overloading이 되어, 전달되는 인자에 따라서 호출되는 함수가 결정됨

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

09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31
08-3 가상 소멸자와 참조자의 참조 가능성  (0) 2019.01.29
08-2 가상함수  (0) 2019.01.29
07-4 상속을 위한 조건  (0) 2018.01.22
static  (0) 2018.01.10

상속을 위한 조건


*상속 관계를 가질 수 있느 관계는 2가지가 있다


1.IS-A관계


*A is a B

-A는 B의 범주안에 들어감


ex)예시

전화기->무선전화기

전화기(Base Class)

무선전화기(Derived Class)


컴퓨터->노트북 컴퓨터

컴퓨터(Base Class)

노트북 컴퓨터(Derived Class)


*Base Class일수록 더 근본적인 것, Derived Class일수록 더 구체적인 것


2.HAS-A 관계


ex)예시

경찰 has a 총

총(Base Class)

경찰(Derived Class)


총에 관련된 멤버 변수를 경찰Class가 상속 받는다


*이렇게 되면 두 class간의 커플링(의존도)가 높아진다


--------------------------------------------------------------------


결론:has-A관계는 상속으로 표현하지 말자(대신 Police에 멤버 변수로 Gun객체를 포함시킴)


=====================================








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

09-1 멤버함수와 가상함수의 동작원리  (0) 2019.01.31
08-3 가상 소멸자와 참조자의 참조 가능성  (0) 2019.01.29
08-2 가상함수  (0) 2019.01.29
08-1 객체 포인터의 참조관계  (0) 2019.01.15
static  (0) 2018.01.10

+ Recent posts