CPP Module 07

hhkim·2022년 6월 21일
0

42cursus

목록 보기
16/20
post-thumbnail

ex00 - Start with a few functions

개념

템플릿

원하는 타입을 넣으면 코드를 찍어내는 일종의 틀

함수 템플릿

template <typename T>
T add(T &a, T &b) { return a + b; }
  • 위의 함수를 add(1, 2)와 같이 사용하면 컴파일러가 알아서 add<int>(a, b)로 인스턴스화

구현

함수 템플릿 구현

  • swap(): 두 인자를 스왑. 리턴값 없음
  • min(): 두 인자를 비교해서 작은 값을 리턴. 같은 경우 두 번째 값을 리턴
  • max(): 두 인자를 비교해서 큰 값을 리턴. 같은 경우 두 번째 값을 리턴
  • 어떤 타입의 인자로든 호출할 수 있어야 함
  • 전달되는 두 인자는 같은 타입이어야 하며 모든 비교 연산자를 지원해야 함

템플릿은 헤더에 정의되어야 함

테스트 코드

int	main(void) {
	int	a = 2;
	int	b = 3;

	::swap( a, b );
	std::cout << "a = " << a << ", b = " << b << std::endl;
	std::cout << "min( a, b ) = " << ::min( a, b ) << std::endl;
	std::cout << "max( a, b ) = " << ::max( a, b ) << std::endl;
	std::string c = "chaine1";
	std::string d = "chaine2";
	::swap(c, d);
	std::cout << "c = " << c << ", d = " << d << std::endl;
	std::cout << "min( c, d ) = " << ::min( c, d ) << std::endl;
	std::cout << "max( c, d ) = " << ::max( c, d ) << std::endl;

	return (0);
}

👉 결과

a = 3, b = 2
min(a, b) = 2
max(a, b) = 3
c = chaine2, d = chaine1
min(c, d) = chaine1
max(c, d) = chaine2

ex01 - Iter

구현

iter()

아무것도 리턴하지 않고 3개의 파라미터를 받는 함수

  • 첫 번째 파라미터: 배열의 주소
  • 두 번째 파라미터: 배열의 길이
  • 세 번째 파라미터: 배열의 각 요소에 대해 호출할 함수
  • 어떤 타입의 배열이든 동작해야 함
  • 세 번째 파라미터는 인스턴스화된 함수 템플릿일 수 있음

ex02 - Array

개념

클래스 템플릿

https://ansohxxn.github.io/cpp/chapter13-2/
클래스를 만드는 틀

  • 일반화
template <typename T>
class Data {
private:
    T data_;

public:
    Data(T dt);
    T get_data();
};
  • 구체화
    • 클래스를 인스턴스화할 때 타입을 명시해서 컴파일러가 메모리를 얼마나 할당받아야 하는지 알려줌
int main(void) {
	Data<int> data(10);
    
    std::cout << data.get_data() << std::endl;
    
    return (0);
}

구현

클래스 템플릿 Array

  • 인자 없는 생성자: 빈 배열 생성
  • unsigned int n을 받는 생성자: n개의 요소를 갖는 배열 생성
    • 팁: int *a = new int();를 실행하고 *a를 출력
  • 복사 생성자와 복사 대입 연산자: 원래 배열이나 복사할 배열이 서로 영향을 미치지 않아야 함
    👉 깊은 복사!
  • 메모리 할당에 new[] 연산자 사용
    • 미리 메모리 할당 금지
  • 첨자 연산자 []로 각 요소에 접근할 수 있어야 함 (첨자 연산자 오버로딩)
    • 범위 외의 인덱스에 접근하면 std::exception 던지기
  • 멤버 함수 size(): 배열의 길이 리턴
    • 인자를 받지 않고 현재 인스턴스를 수정하지 않음

0개의 댓글