C++ 12.4.1 구조 함수 (클래스 이름과 같고 되돌아오는 형식이 없음) -- 초기화 목록의 구조 함수

간단한 소개

  • 구조 함수의 이름은 클래스의 이름과 같고 반환 형식을 지정할 수 없습니다!!!인삼이 없거나 여러 개의 인삼을 정의할 수 있다
  • 구조 함수는const
  • 로 성명할 수 없습니다
  • 클래스 형식의const 대상을 만들 때 일반적인 구조 함수를 실행하여 이const 대상을 초기화합니다.
  • 초기화 목록(초기화식)의 구조 함수 포함
  • 다른 어떤 함수와 마찬가지로 구조 함수는 이름, 형참표와 함수체를 가지고 있다.다른 함수와 달리 구조 함수도 하나의 구조 함수 초기화 목록을 포함할 수 있다
  • 구조 함수 초기화 목록은 사칭으로 시작하고 쉼표로 구분된 데이터 구성원 목록으로 각 데이터 구성원 뒤에 원괄호에 놓인 초기화식이 있다.
  • 구조 함수도 클래스의 내부나 외부에 정의할 수 있으며 구조 함수 초기화 목록은 성명에서 지정하지 않고 구조 함수의 정의에만 정의할 수 있다.
  • 구조 함수 초기화 목록은 생략할 수 있으며 초기화 목록을 생략하고 구조 함수 체내에서 데이터 구성원에 대한 값을 부여하는 것은 합법적이다.그러나 const나 인용 형식의 구성원은 어떤 유형이든 구조 함수 초기화 목록에서 초기화해야 한다.그래서 초기화 목록이 있는 구조 함수를 사용해야 합니다 **
  • 구조 함수 초기화 목록에 언급된 모든 구성원을 표시하지 않고 초기화 변수와 같은 규칙을 사용하여 초기화합니다.이 형식의 기본 구조 함수를 실행하여 클래스 형식의 데이터 구성원을 초기화합니다.내장되거나 유형에 맞는 구성원의 초기화 값은 대상의 역할 영역에 의존한다. 국부 역할 영역에서 이 구성원들은 초기화되지 않고 전역 역할 영역에서 0
  • 으로 초기화된다.
  • 모든 const나 인용 형식 구성원 및 기본 구조 함수가 없는 클래스 형식의 구성원에게 초기화식
  • 을 사용해야 합니다
  • 구성원이 초기화된 순서는 구성원의 순서를 정의하는 것이다.
  • 일반적인 상황에서 구조 함수의 형삼을 사용하여 대상의 데이터 구성원이 아닌 초기화식의 집행 순서로 인한 어떠한 문제도 피할 수 있다



  • ========================================================================================================================

    1. 구조 함수

  • 구조 함수는 특수한 구성원 함수로 클래스 유형의 새로운 대상을 만들기만 하면 구조 함수를 실행한다.
  • 구조 함수의 작업은 모든 대상의 데이터 구성원이 적당한 초기 값을 가지도록 하는 것이다.
  • class Sale_item{
    public:
        Sale_item():units_sold(0),revenue(0.0){}// 
    private:
        std::string isbn;
        unsigned units_sold;
        double revenue;
    };
  • isbn 구성원은string의 기본 구조 함수에서 은식으로 공백으로 초기화
  • 구조 함수의 이름은 클래스의 이름과 같고 되돌아오는 형식을 지정할 수 없습니다.인삼이 없거나 여러 개의 인삼을 정의할 수 있다
  • 1. 구조 함수 재부팅

  • 하나의 클래스에 대해 설명할 수 있는 구조 함수의 수량은 제한이 없고 모든 구조 함수의 형참표가 유일하기만 하면 된다.서로 다른 구조 함수는 사용자가 데이터 구성원을 초기화하는 방식을 지정할 수 있도록 한다.
  • // Sale_item : isbn , istream :
    class Sale_item;// 
    public:// 
       Sale_item(const std::string&);
       Sale_item(std::istream&);
       Sale_item();

    2. 실참은 어떤 구조 함수를 사용할지 결정한다.

    Sale_item empty;
    Sale_item Primer_3rd_Ed("0-201-82470-1");
    Sale_item Primer_4th_ed(cin);
    // 。 empty , , 。 string Primer_3rd_Ed

    3. 구조 함수 자동 집행

  • 이 유형의 대상을 만들면 컴파일러가 구조 함수를 실행한다
  • Sale_item Primer_2nd_Ed("0-201-82470-8");// string 。
    Sale_item *P=new Sale_item();// Sale_item , , 

    4.const 대상에 사용되는 구조 함수

  • 구조 함수는const
  • 로 성명할 수 없습니다
  • 클래스 형식의const 대상을 만들 때 일반적인 구조 함수를 실행하여 이const 대상을 초기화합니다.

  • 2. 구조 함수 초기화식


    1. 초기화 목록이 있는 구조 함수

  • 다른 어떤 함수와 마찬가지로 구조 함수는 이름, 형참표와 함수체를 가지고 있다.다른 함수와 달리 구조 함수도 하나의 구조 함수 초기화 목록을 포함할 수 있다
  • 구조 함수 초기화 목록은 사칭으로 시작하고 쉼표로 구분된 데이터 구성원 목록으로 각 데이터 구성원 뒤에 원괄호에 놓인 초기화식이 있다.
  • 구조 함수도 클래스의 내부나 외부에 정의할 수 있으며 구조 함수 초기화식은 성명에서 지정하지 않고 구조 함수의 정의에만 정의할 수 있다.
  • 구조 함수 초기화 목록에 언급된 모든 구성원을 표시하지 않고 초기화 변수와 같은 규칙을 사용하여 초기화합니다.이 형식의 기본 구조 함수를 실행하여 클래스 형식의 데이터 구성원을 초기화합니다.내장되거나 유형에 맞는 구성원의 초기화 값은 대상의 역할 영역에 의존한다. 국부 역할 영역에서 이 구성원들은 초기화되지 않고 전역 역할 영역에서 0
  • 으로 초기화된다.
    Sale_item:: Sale_item(const string& book):isbn(book),units_sold(0),revenue(0.0){}

    2. 초기화 목록이 없는 구조 함수, 함수체에 값 부여

  • 구조 함수 초기화 목록은 생략할 수 있으며, 초기화 목록을 생략하고 구조 함수 체내에서 데이터 구성원에 대한 값을 부여하는 것은 합법적이다
  • // 
    Sale_item:: Sale_item(const string& book)
    {isbn=book;
    units_sold=0;
    revenue=0.0;
    }

    3. 구조 함수를 사용하여 목록 초기화 시기 - – const 또는 참조 유형의 구성원

  • 클래스 구성원에게 초기화식을 제공하지 않으면 컴파일러는 구성원 형식의 기본 구조 함수를 은밀하게 사용합니다.만약 그 클래스에 기본 구조 함수가 없다면 컴파일러가 기본 구조 함수를 사용하려고 시도하면 실패할 것입니다.이때 데이터 구성원을 초기화하기 위해서는 초기화식을 제공해야 한다.
  • 일부 구성원은 구조 함수 초기화 목록에서 초기화해야 한다.이런 구성원들은 구조 함수 함수체에서 그들에게 값을 부여하는 데 작용하지 않는다.기본 구조 함수가 없는 클래스 형식의 구성원, const나 인용 형식의 구성원, 어떤 종류든지 구조 함수 초기화 목록에서 초기화해야 합니다.(const와 인용 형식은 정의할 때 초기화해야 하며 뒤에 값을 부여할 수 없습니다)
  • 내장 유형의 구성원은 은밀하게 초기화하지 않기 때문에 이 구성원에 대해 초기화하든 값을 부여하든 상관없는 것 같다.비클래스 유형의 데이터 구성원에 대해 값을 부여하거나 초기화식을 사용하는 것은 결과와 성능에 있어서 모두 등가이다.
  • const 대상이나 인용 형식의 대상은 초기화할 수 있으나 값을 부여할 수 없습니다. 구조 함수의 함수체를 실행하기 전에 초기화를 완료해야 합니다.초기화의 유일한 기회는 구조 함수 초기화 목록에 있습니다.(모든 구성원을 언급하지 않아도 기본 초기화 형식을 사용합니다.)
  • // 
    class ConstRef{
    public:
        ConstRef(int ii);
    private:
        int i;
        const int ci;
        int &ri;// 。ri 
    };
    ConstRef::ConstRef(int ii){
       i=ii;// 
       ci=ii;// !!! const 
       ri=i;// !!!ri 
    }
    
    // 
    ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(ii){}

    4. 초기화 목록이 있는 구조 함수 - 구성원 초기화 순서

  • 모든 구성원은 구조 함수 초기화 목록에서 한 번만 가리킬 수 있으며, 구조 함수 초기화 목록은 구성원을 초기화하는 데 사용할 값만 지정하고, 이러한 초기화 실행 순서는 지정하지 않는다.구성원이 초기화된 순서는 구성원의 순서를 정의하는 것이다.
  • 초기화의 순서는 항상 중요하지 않지만, 한 구성원이 다른 구성원에 따라 초기화되면 구성원의 초기화 순서가 중요하다
  • class X{
       int i;// private 
       int j;// i, i j
     public:
       X(int val):j(val),i(j){}// 。 
    };
  • 이 초기화표에서 i 구성원이 먼저 정의되었기 때문에 i는 먼저 초기화되었다.이 초기화표의 효과는 아직 초기화되지 않은 j값으로 i를 초기화하는 것이다.먼저 val로 j를 초기화하는 것이 아니라그래서 위에 그게 잘못된 거예요
  • 일반적인 상황에서 구조 함수의 형삼을 사용하여 대상의 데이터 구성원이 아닌 초기화식의 집행 순서로 인한 어떠한 문제도 피할 수 있다
  • // 1
    X(int val):i(val),j(val){}// , ,i j 
    // 2
    class X{
       int j;// private 
       int i;// j, j i
     public:
       X(int val):j(val),i(j){}// 。 
    };
    

    5. 초기화 목록이 있는 구조 함수 - 초기화식은 임의의 표현식이 될 수 있다

    Sale_item(const std::string &book,int cnt,double price):isbn(book),units_sold(cnt),revenue(cnt * price){}//revenue revenue 

    6. 초기화 목록이 있는 구조 함수 - 클래스 유형의 데이터 구성원의 초기화식

  • 클래스 유형의 구성원을 초기화할 때 실참을 지정하여 구성원 유형에 전달하는 구조 함수를 지정해야 한다.이 유형의 임의의 구조 함수를 사용할 수 있다.
  • 좋은 웹페이지 즐겨찾기