CPP/씹어먹는 c++

[c++개념공부]함수 오버로딩, 생성자, default

뜨거운 개발자 2023. 1. 27. 19:25

 


💻함수의 오버로딩
  • c에서 같은 이름을 가진 함수는 불가능 c++ 에서는 같은 이름을 가진 함수가 여러 개 가능하다.
  • c++에서 같은 이름의 함수를 호출할 때 구분하는 방법 : 함수를 호출할 때 사용하는 인자를 보고 결정한다.
  • c++ 에서는 컴파일러가 알아서 적합한 인자를 가지는 함수를 호출해준다.
    • 단 정확하게 인자가 일치하지 않는다면 가장 근접한 함수를 찾는다.

c++ 컴파일러에서 함수를 오버로딩하는 과정! (단, 같은 과정에서 2개 이상 일치 시 오류 발생)

  1. 자신의 타입이 일치하는 함수를 찾는다.
  1. 정확하게 일치가 없는경우
    1. char, unsigned char, short → int
    1. unsinged shot 는 크기에 따라 int 또는 unsigned int
    1. float → double
    1. Enum → int
  1. 이래도 없을 때
    1. 숫자 타입은 숫자 타입이 된다. ( ex : float → int)
    1. enum도 임의의 숫자 타입이 된다. ( ex : enum → double)
    1. 0 은 포인터 타입이나 숫자 타입으로 변환된 0포인터나 0숫자타입으로 변한다.
    1. 포인터는 void 포인터로 전환된다.
  1. 이래도 없을 때
    1. 유저 정의 타입 변환으로 일치하는 것을 찾는다.

 

클래스 외부에서 메소드 내용 작성

클래스 내부에는 함수의 프로토타입만 선언해두고 보통 함수의 몸통은 바깥에 적어준다.

(단, 템플릿 클래스는 모두 내부에 적는다)

바깥에서 메소드를 정의하는 방법 : 자료형 클래스이름:: 클래스 내부 메소드() : void Date::ShowDate()

 

생성자

목적 : 초기화를 실수로 하지 않으면 문제가 발생하기 쉽다. 생성한 객체를 초기화해주는 걸 편리하게 해주기 위해서

생성자의 특징

  • 객체 생성시 자동으로 호출되는 함수 →객체를 초기화해주는 역활을 한다.
  • 리턴값이 없다. 클래스이름 (인자){ //클래스 멤버변수 초기화 코드 }

암시적 방법과 명시적 방법

객체를 생성자를 호출하며 생성하는 방법은 두가지가 있는데 크게 암시적 방법과 명시적 방법이 있습니다.

Date day(2011, 3, 1);      
// 암시적 방법 (implicit) 
Date day=Date(2012, 3, 1);
// 명시적 방법 (explicit) 
//많은 프로그래머들은 축약을 좋아하기때문에 주로 암시적 방법을 사용한다.

 

디폴트 생성자(default 생성자)

  • 클래스에서 사용자가 어떠한 생성자로 명시적으로 정의하지 않을 때 컴파일러가 자동으로 추가하는 생성자.
  • 다만 사용자가 어떤 생성자를 추가한 순간 컴파일러는 자동으로 디폴트 생성자를 삽입하지는 않는다.
  • 우리도 디폴트 생성자를 선언할 수 있다.
    Date() {//인자가 없는 생성자를 만든것이다.   year = 2012;   month = 7;   day = 12; }

     

  • 디폴트 생성자 주의사항

    절대로 인자가 없는 생성자를 호출하기 위해서 A a() 처럼 하면 안된다.

    Date day3(); 이런식으로는 디폴트 생성자를 호출 할 수가 없습니다.

    위의 코드의 의미는 day3객체를 디폴트 생성자를 이용해서 초기화 하는 것이 아니라, 리턴값이 Date 이고 인자가 없는 함수 day3 을 정의하게 된 것으로 인식합니다. 이는 암시적 표현으로 객체를 선언할 때 반드시 주의해 두어야 할 사항입니다.

  • C++ 11 부터 명시적으로 디폴트 생성자를 사용하도록 명시가 가능하다.
    class Test 
    {  public:   Test() = default;  
    // 디폴트 생성자를 정의해라 사실상 명시적으로 보여주기 위한 작업일뿐 적지 않은것과 같긴하다. 
    };

 

생성자 오버로딩 : 생성자 역시 함수이기 때문에 오버로딩이 가능하다.

 Date() 
 {    
     std::cout << "기본 생성자 호출!" << std::endl;        
     year_ = 2012; 			
     month_ = 7; 		
     day_ = 12; 			
 } 						
 Date(int year, int month, int day) { 		
     std::cout << "인자 3 개인 생성자 호출!" << std::endl; 		
     year_ = year; 												
     month_ = month;                                                          
    day_ = day; 
}

 


Uploaded by

N2T
728x90