ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++
    프로그래밍 언어/클래스 2009. 1. 1. 01:12
    상속시 생성자, 소멸자, 대입 연산자 등은 제외된다.
    가상 소멸자의 가상성(?)은 상속

    실행할 가상(virtual) 함수를 런타임에 선택하는 것은 그 함수가 레퍼런스나 포인터를 통해 호출될 때에만 가능하다.
    그렇지 않으면 정적 바인딩

    가상 함수는 프로그램에서 그 함수를 호출하는지 여부에 상관 없이, 꼭 정의되어야 한다.
    파생 클래스에서 오버라이드하는 함수의 타입은 기본 클래스의 그 가상 함수의 타입과 같아야 한다.
    단, 반환 타입은 예외

    반드시 초기화 리스트로 멤버를 초기화해야 하는 경우
        상속받은 멤버를 초기화
        포함된 객체 초기화
        상수 멤버 초기화
        레퍼런스 멤버 초기화

    만약 클래스가 아무 생성자라도 명시적으로 정의했다면, 컴파일러는 그 클래스에 대한 디폴트 생성자를 자동으로 만들어 주지 않는다.
    eg. Position There[3]={Position(1,2,'x'),Position(3,4,'y'),Position(5,6,'z')};
    디폴트 생성자를 사용하는 클래스의 데이터 멤버로 사용되기 위해서는, 그 데이터 타입 자체로 디폴트 생성자를 제공해야 한다.

    컴파일러가 자동으로 만들어주는 복사 생성자와 대입 연산자는 클래스의 데이터 멤버들을 단순 복사(얕은 복사)

    rule of three
    만약 클래스에 소멸자가 필요하면(생성자 네에서 리소스를 할당), 십중팔구 대입 연산자 뿐만 아니라, 복사생성자도 필요

    복사 생성자
    자신과 같은 타입의 다른 객체에 대한 레퍼런스를 전달받아 이 레퍼런스로부터 자신을 초기화한다
    객체가 함수의 인수로 전달될 때

    암묵적 복사 : 함수의 인자(by value), 함수의 리턴값
    명시적 복사 : 초기화

    (타입 )변환 생성자(Conversion Constructor)
        다른 타입(기본 타입 포함)으로부터 객체를 만드는 생성자이며 인수를 하나만 취한다
        r value에서 타입 변환을 위한 임시 객체 생성시 등

        변환 생성자는 편리하기도 하지만 클래스(타입)간의 구분을 모호하게 만든다.
        explicit로 지정된 생성자는 암시적인 형 변환에 사용할 수 없도록 금지된다.

    사용자 정의 변환
    단일 인자를 갖는 생성자
    explicit 키워드

    (타입 )변환 연산자 // 변환 함수?
    목표 타입에 생성자를 추가하는 것이 불가능
    객체으로부터 다른 타입의(기본 타입 포함) 객체 값을 반환
    클래스의 멤버로 정의
    .operator {타입이름} () { .. }
    cf. int operator() (int a,int b,int c,int d) { return a+b+c+d; } // 리턴타입 operator{연산자} (인수 목록) { 함수 본체; }

    암시적 변환이 문제가 된다면 변환 함수를 만들지 말고 명시적인 함수

    연산자 오버로딩
    대입 연산자
    자신과 같은 타입(??)의 다른 객체를 대입받을 때 사용하는 연산자

    안전한 대입 연산자 // sutter
    대입 연산자가 복사 생성자를 호출하도록 한다.
    예외가 발생했을 때 객체의 생성이 불완전한 상태로 끝나는 것을 방지할 수 있다. //??
    인덱스 연산자
    입출력 연산자

    복사 생성 및 대입 금지 // 싱글톤?
        복사 생성자와 대입 연산자를 선언하되 둘 다 private 영역에 둔다.
        외부에서 불가능한 동작을 시도하면 컴파일러가 막아주고 내부에서 엉뚱한 짓을 하려면 링커가 막아준다.

    추상 기본 클래스

    순수 가상 함수

    virtual 메커니즘이 동작하지 않는 환경
    (1) 기본 클래스의 생성자와 소멸자 내
    (2) 기본 클래스의 포인터나 레퍼런스가 아니라 기본 클래스의 객체를 사용

    RTTI
    type_info 클래스
    #include <typeinfo>
    typeid 연산자
    .name()

    새로운 클래스의 생성
    복사 생성자
    복사 대입 연산자
    iostream 연산자 오버로딩
    제네릭 핸들 클래스(스마트 포인터??)



    핸들 클래스



    참조 사이트:

Designed by Tistory.