ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] default parameter
    C++ 2023. 4. 19. 21:52

     

    C++에서는 함수나 생성자의 매개변수에 일부분에 default 값으로 지정가능함

     
    정의할 시에는
     

    반드시 오른쪽부터 채워야함
    무조건 오른쪽 정렬

     

    void func(int a=0, int b=0);
    
    void func2(int a, int b=5, int c=3, int d=10);
    
    void func3(int a=4, int b, int c=5); // error
    
    void func4(int a=10, int b=20, int c); // error

     

    함수 호출 시 인자값은 왼쪽부터 채워짐

     


     
    여기서 생성자에 디폴트 매개변수를 도입하는게 진짜 개 골때리는 부분이다
     
    이게 생성자에 디폴트 매개변수를 도입하면
    한 개의 생성자가 커버칠 수 있는 다른 생성자들이 생긴다
     
    예를 들어

    class Point {
    private:
    	int x, y;
        
    public:
    	Point(int x = 10, int y = 10) {
    		this->x = x; this->y = y;
    	}
    
    	void print() {
    		cout << "x: " << x << " " << "y: " << y << endl;
    	}
    };

     
    이렇게 Point 클래스에 매개변수 있는 생성자를 정의해놓으면
    이 생성자는
     

    Point();
    
    Point(int x);
    
    Point(int x,int y);

     
    이 세 개를 다 커버칠 수 있다
     
    그래서 우리가 저 세 개를 정의 안해놔도 된다
    정의해 놓으면 중복정의가 뜬다

     


     그리고 이렇게 디폴트 매개변수 생성자로 커버칠 수 있는 생성자를 또 하나 선언하면 에러뜬다
     

    	Point(int x) {
    		this->x = x;
    		this->y = 0;
    	}
        
    	Point(int x = 10, int y = 10) {
    		this->x = x; this->y = y;
    	}

     
    이게 빨간줄이 그어지는건 아닌데 
    나중가서 compile할때 
    만약 Point(5) 이런 놈이 호출되면 둘 중 누굴 불러야할지 모르기 때문에 에러남 ㅇㅇ

     


    그래서 이런 형태도 가능하다
     

    #include <iostream>
    
    using namespace std;
    
    class A {
    private:
    	int x;
    public:
    	A(int x=20) {
    		this->x = x;
    	}
    
    	void print() {
    		cout << x;
    	}
    };
    
    class B : public A {
    private:
    	int y;
    public:
    	/*
    	B() : A() {
    		// empty
    	}
    	*/
    
    	B(int x = 10, int y = 10) : A(x) {
    		this->y = y;
    	}
    
    	void print() {
    		A::print();
    		cout << y;
    	}
    };
    
    int main() {
    	B b1; // B b1();
    	B b2(1);
    	b1.print();
    	b2.print();
    	return 0;
    }

     
    여기서 저 주석부분 해제하면 중복으로 에러남

    'C++' 카테고리의 다른 글

    [C++] 반환형 참조형 (return값이 참조형일때)  (0) 2023.04.15
    [C++] MyString 클래스 실습  (0) 2023.04.13
    [C++] const  (1) 2023.04.12
    [C++] 접근지정자 (access modifiers)  (3) 2023.04.11
    [C++] friend  (2) 2023.04.11