ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 열혈강의 C++(잊어버린 부분 정리 2)
    @ 16. 1 ~ 17. 1/C++ 2014. 4. 7. 23:50

    17. operator 키워드와 연산자를 묶어서 함수의 이름을 정의한다.

    연산자 오버로딩의 방법에는 2가지가 있다.

    전역함수로 설정하는 방법, 멤버함수로 설정하는 방법

    둘다 오버로딩 되어있다면 멤버함수로 설정하는 방법에 전역함수의 방법은 가려지게 된다.

    * 기본데이터형의 연산자 오버로딩은 그 의미가 정해져있으므로 의미를 변경하는 함수의 정의는 허용하지 않는다

     

    18. 유도 클래스에 삽입된 디폴트 대입 연산자가 기초 클래스의 대입연산자(디폴트가 아니여도)까지 호출한다

    유도 클래스의 대입연산자(디폴트 말고)정의에서 명시적으로 기초 클래스의 대입 연산자 호출문을 삽입하지 않으면 기초 클래스의 대입 연산자는 호출되지 않아서 기초 클래스의 멤버변수는 복사 대상에서 제외된다.

    유도클래스& operator=(const 유도클래스& ref)

    {

    기초 클래스::operator=(ref);

    }

    여기서 ref는 유도클래스 참조자인데 이를 기초형 참조자로 매개변수를 선언한 operator= 함수의 인자로 전달이 가능한가?

    C++ 에서는 AAA형 참조자는 AAA객체 또는 AAA를 직 간접으로 상속하는 모든 객체를 참조할 수 있다.

     

    19. 템플릿

    19-1. 함수 템플릿

    template<typename T>

    T add(T num1, T num2)

    {

    return num1+num2;

    }

    위의 템플릿을 기반으로 컴파일러가 만들어 내는 다음 유형의 함수들을 가리켜 템플릿 함수라고 한다.

    int add<int>(int num1, int num2)

    {

    return num1+num2;

    }

     

    호출시 add<int>(1,2) 또는 add(2.4,2.0) 이런식으로 <자료형>선언 또는 생략가능하다.

    하지만

    템플릿 클래스의 경우에는

    <자료형>을 생략못한다.

    template<typename T>

    class A
    {
    public:

    T A();

    }

    A<int> a;

     

    위 클래스 템플릿 멤버함수를 클래스 외부에서 정의하려면

    template<typename T>

    T A<T>::A()
    {
    }

     

    20. 템플릿 클래스의 파일을 나눌때 고려사항

    헤더파일에 템플릿 클래스의 생성자와 멤버함수의 정의를 모두 넣거나,

    또는 main.cpp 에 #include "~~~~~~~~~.cpp"를 한다.

    왜냐면 템플릿의 함수는 컴파일러 단계에서 생성이되고(cpp의 내용이 필요하단소리다)

    *템플릿 함수나 클래스만 그런것이지 다른건 상관없다.

    컴파일시에는 파일단위 컴파일이기 때문에 인접 cpp파일의 내용을 참조하지 않는다.

     

    21. 클래스 템플릿 특수화

    특후화하는 이유는 특정 자료형을 기반으로 생성된 객체에 대해 구분이 되는 다른 행동양식을 적용하기 위해서이다

    template<typename T>

    class Sosimple

    {

    public:

    T Simple(T num){....}

    };

    이를 기반으로 int에 대해 특수화한 템플릿 클래스

    template<>

    class Sosimple<int>
    {
    public:
    ....
    }

    template<>

    class Sosimple<char*>

    {
    public:
    ....

    }

    이런식으로 구분되고 해당 특수화에 맞게 진행이 된다<int> <char*>

     

    22. 템플릿관련 정의에는 template<typename T> (1번)또는 template<> (2번)가 있는데

    각자 언제 선언이 필요한가?

    T라는 문자가 선언되었다면 1번 없다면 2번(특수화)

Designed by Tistory.